mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2026-09-13 13:44:10 +00:00
Compare commits
61
Commits
8eb1a47b5a
...
latest
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ef11879dc0 | ||
|
|
e3d9f03097 | ||
|
|
f90b7e9d91 | ||
|
|
e489c0f77d | ||
|
|
99dd04cbf5 | ||
|
|
4dac338e2c | ||
|
|
ff47722693 | ||
|
|
6aed13a9b2 | ||
|
|
dbf54f09f5 | ||
|
|
204ad1f8c9 | ||
|
|
928e1e7a69 | ||
|
|
a6ea91439b | ||
|
|
7735c9e8f2 | ||
|
|
a22cab95fa | ||
|
|
629c20ee11 | ||
|
|
5d75583dba | ||
|
|
2ec8450b78 | ||
|
|
f911950aee | ||
|
|
d1b97daff0 | ||
|
|
7caa5a1ba0 | ||
|
|
3ba7099987 | ||
|
|
0a50a9b1fa | ||
|
|
6291bdfa5d | ||
|
|
81fa7c592e | ||
|
|
1b345f788d | ||
|
|
7a709ba497 | ||
|
|
b4548ed257 | ||
|
|
5f548c3287 | ||
|
|
9d3a49a0de | ||
|
|
355029ca9f | ||
|
|
889ddee86e | ||
|
|
e43226af7e | ||
|
|
09e1ee9914 | ||
|
|
dc623cb32a | ||
|
|
c1e514d8bf | ||
|
|
936cbb5427 | ||
|
|
566167c7d9 | ||
|
|
cc2865ebdd | ||
|
|
6a1f4c9941 | ||
|
|
13c6ed9e06 | ||
|
|
c711d1c6de | ||
|
|
71824d1fc7 | ||
|
|
aaea00f943 | ||
|
|
f01b0fc3a7 | ||
|
|
ad62c79a40 | ||
|
|
e3b36a4084 | ||
|
|
ce2b28651d | ||
|
|
518ac0b4b4 | ||
|
|
c5e2ba024c | ||
|
|
c765b5c9b6 | ||
|
|
84d67c0946 | ||
|
|
04f99688eb | ||
|
|
0991ed467e | ||
|
|
4d8d3f0d46 | ||
|
|
db5ccb018f | ||
|
|
4d4d716e5f | ||
|
|
94926b0ca7 | ||
|
|
98a6199a69 | ||
|
|
416fecfaed | ||
|
|
319dfe6944 | ||
|
|
3d0399b3a8 |
@@ -12,16 +12,20 @@ This release is based on the latest Espressif/Arduino core version 3. It brings
|
|||||||
- Commands Service that can be called via MQTT or API or used in the Scheduler Service
|
- Commands Service that can be called via MQTT or API or used in the Scheduler Service
|
||||||
- option to disable factory reset [#3150](https://github.com/emsesp/EMS-ESP32/issues/3150)
|
- option to disable factory reset [#3150](https://github.com/emsesp/EMS-ESP32/issues/3150)
|
||||||
- TLS support with 4MB boards without PSRAM
|
- TLS support with 4MB boards without PSRAM
|
||||||
|
- added eth_10mbit to Network Settings, which forces 10BASE-T half-duplex & autonegotiation off, halving the PHY’s power draw. It’s off by default as it will cause issues on managed switches with a port forced to 100Mb [#3213](https://github.com/emsesp/EMS-ESP32/pull/3213)
|
||||||
|
- cleaner MD5 and firmware uploading in WebUI [#3222](https://github.com/emsesp/EMS-ESP32/issues/3222)
|
||||||
|
|
||||||
## Fixed
|
## Fixed
|
||||||
|
|
||||||
- shunting yard show json
|
- shunting yard show json
|
||||||
|
- `system/sendmail` called from a Command or the Scheduler computed its value twice, which stripped the quotes from literal text and then failed on characters like `!`. Also shunting yard treated a `?` inside a quoted string as a ternary, so text like `"too hot?"` returned nothing
|
||||||
- memory leak when using different timezones for ems-esp and thermostat[#3184](https://github.com/emsesp/EMS-ESP32/issues/3184)
|
- memory leak when using different timezones for ems-esp and thermostat[#3184](https://github.com/emsesp/EMS-ESP32/issues/3184)
|
||||||
- LED stayed off on a healthy system when "Disable LED" was unchecked
|
- LED stayed off on a healthy system when "Disable LED" was unchecked
|
||||||
- Ethernet MAC address changed with the new SDK, breaking DHCP reservations (currently disabled)
|
- Ethernet MAC address changed with the new SDK, breaking DHCP reservations (currently disabled)
|
||||||
- "IPv4 nameserver" showed an IPv6 address when IPv6 was in use
|
- "IPv4 nameserver" showed an IPv6 address when IPv6 was in use
|
||||||
- HA Discovery warning on Uptime after EMS-ESP boot due to NTP not ready
|
- HA Discovery warning on Uptime after EMS-ESP boot due to NTP not ready
|
||||||
- hc/control setting for UI800 thermostats [#3181](https://github.com/emsesp/EMS-ESP32/discussions/3181)
|
- hc/control setting for UI800 thermostats [#3181](https://github.com/emsesp/EMS-ESP32/discussions/3181)
|
||||||
|
- solar module switches [#3223](https://github.com/emsesp/EMS-ESP32/issues/3223)
|
||||||
|
|
||||||
## Changed
|
## Changed
|
||||||
|
|
||||||
@@ -35,4 +39,5 @@ This release is based on the latest Espressif/Arduino core version 3. It brings
|
|||||||
- changes to the Dialogs in Dashboard page, removed the run icon in the Commands page. Renamed Execute to Run.
|
- changes to the Dialogs in Dashboard page, removed the run icon in the Commands page. Renamed Execute to Run.
|
||||||
- set `None` for undefined values in HA `val_tpl`
|
- set `None` for undefined values in HA `val_tpl`
|
||||||
- changes in WebUI - remove multiple calls systemInfo endpoint, Vewrsion pages checks for internet connection [#3195](https://github.com/emsesp/EMS-ESP32/pull/3195)
|
- changes in WebUI - remove multiple calls systemInfo endpoint, Vewrsion pages checks for internet connection [#3195](https://github.com/emsesp/EMS-ESP32/pull/3195)
|
||||||
|
- multiple optimization in network, power down WiFi when Ethernet and WiFi nosleep is instant when selected [#3213](https://github.com/emsesp/EMS-ESP32/pull/3213)
|
||||||
|
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ CPPFLAGS += $(DEFINES) $(DEFAULTS) $(INCLUDE)
|
|||||||
CPPFLAGS += -ggdb -g3 -MMD
|
CPPFLAGS += -ggdb -g3 -MMD
|
||||||
CPPFLAGS += -flto=auto
|
CPPFLAGS += -flto=auto
|
||||||
CPPFLAGS += -Wall -Wextra -Werror
|
CPPFLAGS += -Wall -Wextra -Werror
|
||||||
CPPFLAGS += -Wno-unused-parameter -Wno-missing-braces -Wno-vla-cxx-extension -Wno-switch-enum -Wno-unused-lambda-capture
|
CPPFLAGS += -Wno-unused-parameter -Wno-missing-braces -Wno-vla-cxx-extension -Wno-switch-enum
|
||||||
CPPFLAGS += -ffunction-sections -fdata-sections -fno-exceptions -fno-rtti -fno-threadsafe-statics
|
CPPFLAGS += -ffunction-sections -fdata-sections -fno-exceptions -fno-rtti -fno-threadsafe-statics
|
||||||
CPPFLAGS += -Os -DNDEBUG
|
CPPFLAGS += -Os -DNDEBUG
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -16,7 +16,8 @@
|
|||||||
"enableMDNS": true,
|
"enableMDNS": true,
|
||||||
"enableCORS": false,
|
"enableCORS": false,
|
||||||
"CORSOrigin": "*",
|
"CORSOrigin": "*",
|
||||||
"tx_power": 0
|
"tx_power": 0,
|
||||||
|
"eth_10mbit": false
|
||||||
},
|
},
|
||||||
"AP": {
|
"AP": {
|
||||||
"provision_mode": 2,
|
"provision_mode": 2,
|
||||||
|
|||||||
@@ -317,7 +317,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -477,7 +477,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -637,7 +637,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -797,7 +797,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -957,7 +957,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -1117,7 +1117,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -1277,7 +1277,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -1437,7 +1437,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -1597,7 +1597,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -1757,7 +1757,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -1917,7 +1917,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -2077,7 +2077,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -2237,7 +2237,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -2397,7 +2397,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -2557,7 +2557,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -2717,7 +2717,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -2877,7 +2877,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -3037,7 +3037,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -3197,7 +3197,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -3357,7 +3357,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -4067,7 +4067,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -4227,7 +4227,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -4387,7 +4387,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -4547,7 +4547,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -4707,7 +4707,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -4867,7 +4867,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
@@ -5155,7 +5155,7 @@ uint8
|
|||||||
uint8
|
uint8
|
||||||
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 |
|
||||||
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
| absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
|
||||||
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
| heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
|
||||||
int8
|
int8
|
||||||
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
|
||||||
int8
|
int8
|
||||||
|
|||||||
+27
-27
@@ -242,7 +242,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"Greenstar 2000",boiler,11,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"Greenstar 2000",boiler,11,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"Greenstar 2000",boiler,11,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"Greenstar 2000",boiler,11,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"Greenstar 2000",boiler,11,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"Greenstar 2000",boiler,11,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"Greenstar 2000",boiler,11,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"Greenstar 2000",boiler,11,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"Greenstar 2000",boiler,11,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"Greenstar 2000",boiler,11,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"Greenstar 2000",boiler,11,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"Greenstar 2000",boiler,11,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"Greenstar 2000",boiler,11,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"Greenstar 2000",boiler,11,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -362,7 +362,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"C1200W",boiler,12,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"C1200W",boiler,12,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"C1200W",boiler,12,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"C1200W",boiler,12,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"C1200W",boiler,12,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"C1200W",boiler,12,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"C1200W",boiler,12,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"C1200W",boiler,12,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"C1200W",boiler,12,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"C1200W",boiler,12,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"C1200W",boiler,12,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"C1200W",boiler,12,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"C1200W",boiler,12,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"C1200W",boiler,12,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -482,7 +482,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"CS5800iG",boiler,16,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"CS5800iG",boiler,16,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"CS5800iG",boiler,16,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"CS5800iG",boiler,16,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"CS5800iG",boiler,16,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"CS5800iG",boiler,16,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"CS5800iG",boiler,16,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"CS5800iG",boiler,16,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"CS5800iG",boiler,16,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"CS5800iG",boiler,16,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"CS5800iG",boiler,16,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"CS5800iG",boiler,16,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"CS5800iG",boiler,16,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"CS5800iG",boiler,16,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -602,7 +602,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"BK13/BK15, Smartline, GB1*2",boiler,64,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"BK13/BK15, Smartline, GB1*2",boiler,64,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"BK13/BK15, Smartline, GB1*2",boiler,64,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"BK13/BK15, Smartline, GB1*2",boiler,64,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"BK13/BK15, Smartline, GB1*2",boiler,64,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"BK13/BK15, Smartline, GB1*2",boiler,64,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"BK13/BK15, Smartline, GB1*2",boiler,64,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"BK13/BK15, Smartline, GB1*2",boiler,64,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"BK13/BK15, Smartline, GB1*2",boiler,64,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"BK13/BK15, Smartline, GB1*2",boiler,64,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"BK13/BK15, Smartline, GB1*2",boiler,64,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"BK13/BK15, Smartline, GB1*2",boiler,64,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"BK13/BK15, Smartline, GB1*2",boiler,64,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"BK13/BK15, Smartline, GB1*2",boiler,64,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -722,7 +722,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"Logano GB1*5, Logamatic MC10",boiler,72,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"Logano GB1*5, Logamatic MC10",boiler,72,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"Logano GB1*5, Logamatic MC10",boiler,72,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"Logano GB1*5, Logamatic MC10",boiler,72,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"Logano GB1*5, Logamatic MC10",boiler,72,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"Logano GB1*5, Logamatic MC10",boiler,72,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"Logano GB1*5, Logamatic MC10",boiler,72,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"Logano GB1*5, Logamatic MC10",boiler,72,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"Logano GB1*5, Logamatic MC10",boiler,72,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"Logano GB1*5, Logamatic MC10",boiler,72,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"Logano GB1*5, Logamatic MC10",boiler,72,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"Logano GB1*5, Logamatic MC10",boiler,72,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"Logano GB1*5, Logamatic MC10",boiler,72,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"Logano GB1*5, Logamatic MC10",boiler,72,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -842,7 +842,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"Cascade CM10",boiler,81,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"Cascade CM10",boiler,81,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"Cascade CM10",boiler,81,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"Cascade CM10",boiler,81,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"Cascade CM10",boiler,81,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"Cascade CM10",boiler,81,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"Cascade CM10",boiler,81,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"Cascade CM10",boiler,81,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"Cascade CM10",boiler,81,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"Cascade CM10",boiler,81,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"Cascade CM10",boiler,81,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"Cascade CM10",boiler,81,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"Cascade CM10",boiler,81,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"Cascade CM10",boiler,81,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -962,7 +962,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"Logamax Plus GB022",boiler,84,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"Logamax Plus GB022",boiler,84,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"Logamax Plus GB022",boiler,84,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"Logamax Plus GB022",boiler,84,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"Logamax Plus GB022",boiler,84,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"Logamax Plus GB022",boiler,84,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"Logamax Plus GB022",boiler,84,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"Logamax Plus GB022",boiler,84,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"Logamax Plus GB022",boiler,84,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"Logamax Plus GB022",boiler,84,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"Logamax Plus GB022",boiler,84,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"Logamax Plus GB022",boiler,84,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"Logamax Plus GB022",boiler,84,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"Logamax Plus GB022",boiler,84,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -1082,7 +1082,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -1202,7 +1202,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"Topline, GB162",boiler,115,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"Topline, GB162",boiler,115,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"Topline, GB162",boiler,115,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"Topline, GB162",boiler,115,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"Topline, GB162",boiler,115,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"Topline, GB162",boiler,115,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"Topline, GB162",boiler,115,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"Topline, GB162",boiler,115,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"Topline, GB162",boiler,115,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"Topline, GB162",boiler,115,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"Topline, GB162",boiler,115,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"Topline, GB162",boiler,115,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"Topline, GB162",boiler,115,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"Topline, GB162",boiler,115,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -1322,7 +1322,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"Cascade MCM10",boiler,121,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"Cascade MCM10",boiler,121,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"Cascade MCM10",boiler,121,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"Cascade MCM10",boiler,121,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"Cascade MCM10",boiler,121,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"Cascade MCM10",boiler,121,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"Cascade MCM10",boiler,121,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"Cascade MCM10",boiler,121,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"Cascade MCM10",boiler,121,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"Cascade MCM10",boiler,121,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"Cascade MCM10",boiler,121,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"Cascade MCM10",boiler,121,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"Cascade MCM10",boiler,121,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"Cascade MCM10",boiler,121,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -1442,7 +1442,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"Proline",boiler,122,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"Proline",boiler,122,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"Proline",boiler,122,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"Proline",boiler,122,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"Proline",boiler,122,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"Proline",boiler,122,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"Proline",boiler,122,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"Proline",boiler,122,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"Proline",boiler,122,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"Proline",boiler,122,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"Proline",boiler,122,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"Proline",boiler,122,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"Proline",boiler,122,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"Proline",boiler,122,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -1562,7 +1562,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -1682,7 +1682,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"GB212",boiler,131,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"GB212",boiler,131,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"GB212",boiler,131,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"GB212",boiler,131,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"GB212",boiler,131,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"GB212",boiler,131,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"GB212",boiler,131,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"GB212",boiler,131,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"GB212",boiler,131,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"GB212",boiler,131,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"GB212",boiler,131,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"GB212",boiler,131,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"GB212",boiler,131,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"GB212",boiler,131,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -1802,7 +1802,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"GC7000F",boiler,132,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"GC7000F",boiler,132,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"GC7000F",boiler,132,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"GC7000F",boiler,132,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"GC7000F",boiler,132,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"GC7000F",boiler,132,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"GC7000F",boiler,132,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"GC7000F",boiler,132,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"GC7000F",boiler,132,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"GC7000F",boiler,132,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"GC7000F",boiler,132,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"GC7000F",boiler,132,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"GC7000F",boiler,132,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"GC7000F",boiler,132,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -1922,7 +1922,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"Logano GB125/KB195i, Logamatic MC110",boiler,133,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"Logano GB125/KB195i, Logamatic MC110",boiler,133,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"Logano GB125/KB195i, Logamatic MC110",boiler,133,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"Logano GB125/KB195i, Logamatic MC110",boiler,133,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"Logano GB125/KB195i, Logamatic MC110",boiler,133,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"Logano GB125/KB195i, Logamatic MC110",boiler,133,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"Logano GB125/KB195i, Logamatic MC110",boiler,133,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"Logano GB125/KB195i, Logamatic MC110",boiler,133,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"Logano GB125/KB195i, Logamatic MC110",boiler,133,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"Logano GB125/KB195i, Logamatic MC110",boiler,133,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"Logano GB125/KB195i, Logamatic MC110",boiler,133,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"Logano GB125/KB195i, Logamatic MC110",boiler,133,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"Logano GB125/KB195i, Logamatic MC110",boiler,133,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"Logano GB125/KB195i, Logamatic MC110",boiler,133,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -2042,7 +2042,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"Greenstar 30Ri Compact",boiler,154,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"Greenstar 30Ri Compact",boiler,154,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"Greenstar 30Ri Compact",boiler,154,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"Greenstar 30Ri Compact",boiler,154,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"Greenstar 30Ri Compact",boiler,154,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"Greenstar 30Ri Compact",boiler,154,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"Greenstar 30Ri Compact",boiler,154,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"Greenstar 30Ri Compact",boiler,154,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"Greenstar 30Ri Compact",boiler,154,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"Greenstar 30Ri Compact",boiler,154,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"Greenstar 30Ri Compact",boiler,154,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"Greenstar 30Ri Compact",boiler,154,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"Greenstar 30Ri Compact",boiler,154,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"Greenstar 30Ri Compact",boiler,154,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -2162,7 +2162,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"Suprapur-o",boiler,155,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"Suprapur-o",boiler,155,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"Suprapur-o",boiler,155,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"Suprapur-o",boiler,155,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"Suprapur-o",boiler,155,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"Suprapur-o",boiler,155,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"Suprapur-o",boiler,155,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"Suprapur-o",boiler,155,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"Suprapur-o",boiler,155,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"Suprapur-o",boiler,155,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"Suprapur-o",boiler,155,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"Suprapur-o",boiler,155,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"Suprapur-o",boiler,155,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"Suprapur-o",boiler,155,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -2282,7 +2282,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"Cerapur Aero",boiler,167,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"Cerapur Aero",boiler,167,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"Cerapur Aero",boiler,167,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"Cerapur Aero",boiler,167,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"Cerapur Aero",boiler,167,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"Cerapur Aero",boiler,167,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"Cerapur Aero",boiler,167,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"Cerapur Aero",boiler,167,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"Cerapur Aero",boiler,167,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"Cerapur Aero",boiler,167,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"Cerapur Aero",boiler,167,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"Cerapur Aero",boiler,167,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"Cerapur Aero",boiler,167,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"Cerapur Aero",boiler,167,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -2402,7 +2402,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"Hybrid Heatpump",boiler,168,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"Hybrid Heatpump",boiler,168,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"Hybrid Heatpump",boiler,168,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"Hybrid Heatpump",boiler,168,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"Hybrid Heatpump",boiler,168,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"Hybrid Heatpump",boiler,168,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"Hybrid Heatpump",boiler,168,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"Hybrid Heatpump",boiler,168,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"Hybrid Heatpump",boiler,168,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"Hybrid Heatpump",boiler,168,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"Hybrid Heatpump",boiler,168,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"Hybrid Heatpump",boiler,168,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"Hybrid Heatpump",boiler,168,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"Hybrid Heatpump",boiler,168,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -2522,7 +2522,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"Logano GB212",boiler,170,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"Logano GB212",boiler,170,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"Logano GB212",boiler,170,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"Logano GB212",boiler,170,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"Logano GB212",boiler,170,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"Logano GB212",boiler,170,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"Logano GB212",boiler,170,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"Logano GB212",boiler,170,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"Logano GB212",boiler,170,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"Logano GB212",boiler,170,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"Logano GB212",boiler,170,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"Logano GB212",boiler,170,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"Logano GB212",boiler,170,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"Logano GB212",boiler,170,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -3078,7 +3078,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -3198,7 +3198,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"Logamax U122, Cerapur",boiler,203,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"Logamax U122, Cerapur",boiler,203,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"Logamax U122, Cerapur",boiler,203,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"Logamax U122, Cerapur",boiler,203,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"Logamax U122, Cerapur",boiler,203,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"Logamax U122, Cerapur",boiler,203,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"Logamax U122, Cerapur",boiler,203,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"Logamax U122, Cerapur",boiler,203,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"Logamax U122, Cerapur",boiler,203,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"Logamax U122, Cerapur",boiler,203,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"Logamax U122, Cerapur",boiler,203,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"Logamax U122, Cerapur",boiler,203,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"Logamax U122, Cerapur",boiler,203,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"Logamax U122, Cerapur",boiler,203,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -3318,7 +3318,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"Ecomline Excellent",boiler,206,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"Ecomline Excellent",boiler,206,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"Ecomline Excellent",boiler,206,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"Ecomline Excellent",boiler,206,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"Ecomline Excellent",boiler,206,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"Ecomline Excellent",boiler,206,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"Ecomline Excellent",boiler,206,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"Ecomline Excellent",boiler,206,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"Ecomline Excellent",boiler,206,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"Ecomline Excellent",boiler,206,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"Ecomline Excellent",boiler,206,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"Ecomline Excellent",boiler,206,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"Ecomline Excellent",boiler,206,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"Ecomline Excellent",boiler,206,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -3438,7 +3438,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -3558,7 +3558,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"Cascade MC400",boiler,210,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"Cascade MC400",boiler,210,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"Cascade MC400",boiler,210,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"Cascade MC400",boiler,210,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"Cascade MC400",boiler,210,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"Cascade MC400",boiler,210,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"Cascade MC400",boiler,210,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"Cascade MC400",boiler,210,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"Cascade MC400",boiler,210,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"Cascade MC400",boiler,210,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"Cascade MC400",boiler,210,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"Cascade MC400",boiler,210,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"Cascade MC400",boiler,210,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"Cascade MC400",boiler,210,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -3678,7 +3678,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"EasyControl Adapter",boiler,211,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"EasyControl Adapter",boiler,211,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"EasyControl Adapter",boiler,211,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"EasyControl Adapter",boiler,211,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"EasyControl Adapter",boiler,211,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"EasyControl Adapter",boiler,211,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"EasyControl Adapter",boiler,211,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"EasyControl Adapter",boiler,211,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"EasyControl Adapter",boiler,211,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"EasyControl Adapter",boiler,211,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"EasyControl Adapter",boiler,211,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"EasyControl Adapter",boiler,211,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"EasyControl Adapter",boiler,211,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"EasyControl Adapter",boiler,211,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
@@ -3898,7 +3898,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
|||||||
"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
|
||||||
"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
|
||||||
"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
|
||||||
"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1
|
"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
|
||||||
"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
|
||||||
"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
|
||||||
"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
|
||||||
|
|||||||
|
Can't render this file because it is too large.
|
@@ -26,8 +26,8 @@
|
|||||||
"@alova/adapter-xhr": "2.3.3",
|
"@alova/adapter-xhr": "2.3.3",
|
||||||
"@emotion/react": "^11.14.0",
|
"@emotion/react": "^11.14.0",
|
||||||
"@emotion/styled": "^11.14.1",
|
"@emotion/styled": "^11.14.1",
|
||||||
"@mui/icons-material": "^9.3.1",
|
"@mui/icons-material": "^9.4.0",
|
||||||
"@mui/material": "^9.3.1",
|
"@mui/material": "^9.4.0",
|
||||||
"@table-library/react-table-library": "4.1.15",
|
"@table-library/react-table-library": "4.1.15",
|
||||||
"alova": "^3.5.5",
|
"alova": "^3.5.5",
|
||||||
"jwt-decode": "^4.0.0",
|
"jwt-decode": "^4.0.0",
|
||||||
@@ -35,28 +35,28 @@
|
|||||||
"react": "^19.2.8",
|
"react": "^19.2.8",
|
||||||
"react-dom": "^19.2.8",
|
"react-dom": "^19.2.8",
|
||||||
"react-icons": "^5.7.0",
|
"react-icons": "^5.7.0",
|
||||||
"react-router": "^8.3.0",
|
"react-router": "^8.3.1",
|
||||||
"typesafe-i18n": "^5.27.1"
|
"typesafe-i18n": "^5.27.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/js": "^10.0.1",
|
"@eslint/js": "^10.0.1",
|
||||||
"@preact/preset-vite": "^2.10.6",
|
"@preact/preset-vite": "^2.10.6",
|
||||||
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
|
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
|
||||||
"@types/node": "^26.2.0",
|
"@types/node": "^26.5.0",
|
||||||
"@types/react": "^19.2.18",
|
"@types/react": "^19.2.18",
|
||||||
"@types/react-dom": "^19.2.5",
|
"@types/react-dom": "^19.2.7",
|
||||||
"concurrently": "^10.0.5",
|
"concurrently": "^10.0.5",
|
||||||
"eslint": "^10.9.1",
|
"eslint": "^10.10.0",
|
||||||
"eslint-config-prettier": "^10.1.8",
|
"eslint-config-prettier": "^10.1.8",
|
||||||
"etag": "^1.8.1",
|
"etag": "^1.8.1",
|
||||||
"mime-types": "^3.0.2",
|
"mime-types": "^3.0.2",
|
||||||
"prettier": "^3.9.6",
|
"prettier": "^3.9.6",
|
||||||
"rollup-plugin-visualizer": "^7.1.1",
|
"rollup-plugin-visualizer": "^7.1.1",
|
||||||
"terser": "^5.50.0",
|
"terser": "^5.51.2",
|
||||||
"typescript": "^6.0.3",
|
"typescript": "^6.0.3",
|
||||||
"typescript-eslint": "^8.68.0",
|
"typescript-eslint": "^8.70.0",
|
||||||
"vite": "^8.2.2",
|
"vite": "^8.2.2",
|
||||||
"vite-plugin-imagemin": "^0.6.1"
|
"vite-plugin-imagemin": "^0.6.1"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@11.24.0+sha512.bd27e345e976dcb0be0b7a1228217b049a817e21b1f355c90dbe7dc46671895a8bc1e6d06c24554505ea93ea0b45f489a27ec1bfbc8de6a9659fca0f16fa0000"
|
"packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457"
|
||||||
}
|
}
|
||||||
|
|||||||
Generated
+498
-349
File diff suppressed because it is too large
Load Diff
@@ -19,6 +19,7 @@ export const uploadFile = (file: File) => {
|
|||||||
const formData = new FormData();
|
const formData = new FormData();
|
||||||
formData.append('file', file);
|
formData.append('file', file);
|
||||||
return alovaInstance.Post('/rest/uploadFile', formData, {
|
return alovaInstance.Post('/rest/uploadFile', formData, {
|
||||||
timeout: UPLOAD_TIMEOUT
|
timeout: UPLOAD_TIMEOUT,
|
||||||
|
enableUpload: true
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ const CommandsDialog = ({
|
|||||||
{ immediate: false }
|
{ immediate: false }
|
||||||
)
|
)
|
||||||
.onSuccess(() => {
|
.onSuccess(() => {
|
||||||
toast.success(LL.COMMAND_SENT());
|
toast.success(LL.COMMAND_EXECUTED());
|
||||||
})
|
})
|
||||||
.onError((error) => {
|
.onError((error) => {
|
||||||
toast.error(String(error.error?.message || 'An error occurred'));
|
toast.error(String(error.error?.message || 'An error occurred'));
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ const DevicesDialog = ({
|
|||||||
{ immediate: false }
|
{ immediate: false }
|
||||||
)
|
)
|
||||||
.onSuccess(() => {
|
.onSuccess(() => {
|
||||||
toast.success(LL.COMMAND_SENT());
|
toast.success(LL.COMMAND_EXECUTED());
|
||||||
})
|
})
|
||||||
.onError((error) => {
|
.onError((error) => {
|
||||||
toast.error(String(error.error?.message || 'An error occurred'));
|
toast.error(String(error.error?.message || 'An error occurred'));
|
||||||
|
|||||||
@@ -307,6 +307,7 @@ export const BOARD_PROFILES = {
|
|||||||
LOLIN: 'Lolin D32',
|
LOLIN: 'Lolin D32',
|
||||||
OLIMEX: 'Olimex ESP32-EVB',
|
OLIMEX: 'Olimex ESP32-EVB',
|
||||||
OLIMEXPOE: 'Olimex ESP32-POE',
|
OLIMEXPOE: 'Olimex ESP32-POE',
|
||||||
|
OLIMEXPOEW: 'Olimex ESP32-POE-ISO WROVER (PSRAM)',
|
||||||
C3MINI: 'Wemos C3 Mini',
|
C3MINI: 'Wemos C3 Mini',
|
||||||
S2MINI: 'Wemos S2 Mini',
|
S2MINI: 'Wemos S2 Mini',
|
||||||
S3MINI: 'Liligo S3'
|
S3MINI: 'Liligo S3'
|
||||||
|
|||||||
@@ -177,7 +177,7 @@ const ApplicationSettings = () => {
|
|||||||
await sendAPI({
|
await sendAPI({
|
||||||
device: 'system',
|
device: 'system',
|
||||||
cmd: 'sendmail',
|
cmd: 'sendmail',
|
||||||
data: 'Email notification test successful!',
|
data: '"Email notification test successful!"',
|
||||||
id: 0
|
id: 0
|
||||||
})
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
|
|||||||
@@ -165,11 +165,7 @@ const DownloadUpload = () => {
|
|||||||
{LL.UPLOAD()}
|
{LL.UPLOAD()}
|
||||||
</Typography>
|
</Typography>
|
||||||
|
|
||||||
<Typography sx={{ pb: 2 }} color="warning" variant="body1">
|
<SingleUpload text={LL.UPLOAD_BACKUP_TEXT()} doRestart={doRestart} />
|
||||||
{LL.UPLOAD_TEXT()}:
|
|
||||||
</Typography>
|
|
||||||
|
|
||||||
<SingleUpload doRestart={doRestart} />
|
|
||||||
</SectionContent>
|
</SectionContent>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -846,7 +846,7 @@ const Version = () => {
|
|||||||
<Typography sx={{ pt: 2, pb: 2 }} variant="h6" color="primary">
|
<Typography sx={{ pt: 2, pb: 2 }} variant="h6" color="primary">
|
||||||
{LL.UPLOAD()}
|
{LL.UPLOAD()}
|
||||||
</Typography>
|
</Typography>
|
||||||
<SingleUpload doRestart={doRestart} />
|
<SingleUpload text={LL.UPLOAD_FIRMWARE_TEXT()} doRestart={doRestart} />
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</Box>
|
</Box>
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import {
|
|||||||
|
|
||||||
import * as NetworkApi from 'api/network';
|
import * as NetworkApi from 'api/network';
|
||||||
import { API } from 'api/app';
|
import { API } from 'api/app';
|
||||||
|
import { readSystemStatus } from 'api/system';
|
||||||
|
|
||||||
import { updateState, useRequest } from 'alova/client';
|
import { updateState, useRequest } from 'alova/client';
|
||||||
import type { APIcall } from 'app/main/types';
|
import type { APIcall } from 'app/main/types';
|
||||||
@@ -50,6 +51,8 @@ import { isNetworkOpen, networkSecurityMode } from './WiFiNetworkSelector';
|
|||||||
const NetworkSettings = () => {
|
const NetworkSettings = () => {
|
||||||
const { LL } = useI18nContext();
|
const { LL } = useI18nContext();
|
||||||
|
|
||||||
|
const { data: hardwareData } = useRequest(readSystemStatus);
|
||||||
|
|
||||||
const { selectedNetwork, deselectNetwork } = useContext(WiFiConnectionContext);
|
const { selectedNetwork, deselectNetwork } = useContext(WiFiConnectionContext);
|
||||||
|
|
||||||
const [initialized, setInitialized] = useState(false);
|
const [initialized, setInitialized] = useState(false);
|
||||||
@@ -92,7 +95,8 @@ const NetworkSettings = () => {
|
|||||||
nosleep: true,
|
nosleep: true,
|
||||||
enableMDNS: true,
|
enableMDNS: true,
|
||||||
enableCORS: false,
|
enableCORS: false,
|
||||||
CORSOrigin: '*'
|
CORSOrigin: '*',
|
||||||
|
eth_10mbit: current_data ? current_data.eth_10mbit : false
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -136,7 +140,7 @@ const NetworkSettings = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const content = () => {
|
const content = () => {
|
||||||
if (!data) {
|
if (!data || !hardwareData) {
|
||||||
return <FormLoader onRetry={loadData} errorMessage={errorMessage || ''} />;
|
return <FormLoader onRetry={loadData} errorMessage={errorMessage || ''} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -246,6 +250,23 @@ const NetworkSettings = () => {
|
|||||||
}
|
}
|
||||||
label={LL.NETWORK_LOW_BAND()}
|
label={LL.NETWORK_LOW_BAND()}
|
||||||
/>
|
/>
|
||||||
|
{hardwareData.esp_platform === 'ESP32' && (
|
||||||
|
<>
|
||||||
|
<Typography sx={{ pt: 2 }} variant="h6" color="primary">
|
||||||
|
Ethernet
|
||||||
|
</Typography>
|
||||||
|
<BlockFormControlLabel
|
||||||
|
control={
|
||||||
|
<Checkbox
|
||||||
|
name="eth_10mbit"
|
||||||
|
checked={data.eth_10mbit}
|
||||||
|
onChange={updateFormValue}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
label="Force 10Mbit half-duplex"
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
<Typography sx={{ pt: 2 }} variant="h6" color="primary">
|
<Typography sx={{ pt: 2 }} variant="h6" color="primary">
|
||||||
{LL.GENERAL_OPTIONS()}
|
{LL.GENERAL_OPTIONS()}
|
||||||
</Typography>
|
</Typography>
|
||||||
|
|||||||
@@ -369,7 +369,7 @@ const SystemLog = () => {
|
|||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
{data.developer_mode && (
|
{data.developer_mode && (
|
||||||
<IconButton onClick={sendReadCommand} aria-label={LL.EXECUTE()}>
|
<IconButton onClick={sendReadCommand} aria-label={LL.RUN()}>
|
||||||
<PlayArrowIcon color="primary" />
|
<PlayArrowIcon color="primary" />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -14,9 +14,10 @@ import { LinearProgressWithLabel } from './LinearProgressWithLabel';
|
|||||||
|
|
||||||
interface SingleUploadProps {
|
interface SingleUploadProps {
|
||||||
doRestart: () => void;
|
doRestart: () => void;
|
||||||
|
text: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const SingleUpload = ({ doRestart }: SingleUploadProps) => {
|
const SingleUpload = ({ doRestart, text }: SingleUploadProps) => {
|
||||||
const [md5, setMd5] = useState<string>();
|
const [md5, setMd5] = useState<string>();
|
||||||
const [file, setFile] = useState<File>();
|
const [file, setFile] = useState<File>();
|
||||||
const { LL } = useI18nContext();
|
const { LL } = useI18nContext();
|
||||||
@@ -29,11 +30,22 @@ const SingleUpload = ({ doRestart }: SingleUploadProps) => {
|
|||||||
} = useRequest(SystemApi.uploadFile, {
|
} = useRequest(SystemApi.uploadFile, {
|
||||||
immediate: false
|
immediate: false
|
||||||
}).onSuccess(({ data }) => {
|
}).onSuccess(({ data }) => {
|
||||||
if (data && typeof data === 'object' && 'md5' in data) {
|
let payload = data;
|
||||||
setMd5((data as { md5: string }).md5);
|
if (typeof payload === 'string' && payload.length > 0) {
|
||||||
toast.success(LL.UPLOAD() + ' MD5 ' + LL.SUCCESSFUL());
|
try {
|
||||||
|
payload = JSON.parse(payload);
|
||||||
|
} catch {
|
||||||
|
payload = data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (payload && typeof payload === 'object' && 'md5' in payload) {
|
||||||
|
setMd5((payload as { md5: string }).md5);
|
||||||
|
toast.success(LL.UPLOAD_MD5_RECEIVED());
|
||||||
setFile(undefined);
|
setFile(undefined);
|
||||||
} else {
|
} else {
|
||||||
|
if (payload && typeof payload === 'object' && 'md5_ok' in payload) {
|
||||||
|
toast.success(LL.UPLOAD_MD5_MATCHED());
|
||||||
|
}
|
||||||
doRestart();
|
doRestart();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -80,12 +92,17 @@ const SingleUpload = ({ doRestart }: SingleUploadProps) => {
|
|||||||
</Button>
|
</Button>
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<DragNdrop text={LL.UPLOAD_DROP_TEXT()} onFileSelected={setFile} />
|
<DragNdrop
|
||||||
|
text={(md5 ? LL.UPLOAD_MD5_RECEIVED() : text) + '...'}
|
||||||
|
onFileSelected={setFile}
|
||||||
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{md5 && (
|
{md5 && (
|
||||||
<Box sx={{ mt: 2 }}>
|
<Box sx={{ mt: 2 }}>
|
||||||
<Typography variant="body2">{'MD5: ' + md5}</Typography>
|
<Typography variant="body2" color="success">
|
||||||
|
{'MD5: ' + md5}
|
||||||
|
</Typography>
|
||||||
</Box>
|
</Box>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -178,8 +178,6 @@ const cs: Translation = {
|
|||||||
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šechny hodnoty',
|
||||||
DOWNLOAD_SYSTEM_BACKUP: 'Systémová záloha',
|
DOWNLOAD_SYSTEM_BACKUP: 'Systémová záloha',
|
||||||
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',
|
|
||||||
ERROR: 'Neočekávaná chyba, zkuste to prosím znovu',
|
ERROR: 'Neočekávaná chyba, zkuste to prosím znovu',
|
||||||
TIME_SET: 'Čas nastaven',
|
TIME_SET: 'Čas nastaven',
|
||||||
MANAGE_USERS: 'Spravovat uživatele',
|
MANAGE_USERS: 'Spravovat uživatele',
|
||||||
@@ -347,9 +345,13 @@ const cs: Translation = {
|
|||||||
SYSTEM_NAME: 'Název systému',
|
SYSTEM_NAME: 'Název systému',
|
||||||
COMMANDS: 'Příkazy',
|
COMMANDS: 'Příkazy',
|
||||||
COMMANDS_HELP_1: 'Definujte vlastní příkazy pro magistrali EMS',
|
COMMANDS_HELP_1: 'Definujte vlastní příkazy pro magistrali EMS',
|
||||||
COMMAND_SENT: 'Příkaz odeslán',
|
COMMAND_EXECUTED: 'Příkaz úspěšně spuštěn',
|
||||||
RUN: 'Spustit příkaz',
|
RUN: 'Spustit příkaz',
|
||||||
INTERNET_CONNECTION_CHECK: 'Kontrola online pro dostupné verze'
|
INTERNET_CONNECTION_CHECK: 'Kontrola online pro dostupné verze',
|
||||||
|
UPLOAD_BACKUP_TEXT: 'Klikněte, abyste vybrali nebo přetáhli a pustili soubor zálohy (.json) sem',
|
||||||
|
UPLOAD_FIRMWARE_TEXT: 'Klikněte, abyste vybrali nebo přetáhli a pustili soubor firmware .bin/.md5 sem',
|
||||||
|
UPLOAD_MD5_RECEIVED: 'Digest přijat, nyní nahrajte firmware .bin',
|
||||||
|
UPLOAD_MD5_MATCHED: 'MD5 souhlasí, firmware se instaluje...'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default cs;
|
export default cs;
|
||||||
|
|||||||
@@ -178,8 +178,6 @@ const de: Translation = {
|
|||||||
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 Werte',
|
||||||
DOWNLOAD_SYSTEM_BACKUP: 'Systemsicherung',
|
DOWNLOAD_SYSTEM_BACKUP: 'Systemsicherung',
|
||||||
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',
|
|
||||||
ERROR: 'Unerwarteter Fehler, bitte versuchen Sie es erneut.',
|
ERROR: 'Unerwarteter Fehler, bitte versuchen Sie es erneut.',
|
||||||
TIME_SET: 'Zeit gesetzt',
|
TIME_SET: 'Zeit gesetzt',
|
||||||
MANAGE_USERS: 'Nutzerverwaltung',
|
MANAGE_USERS: 'Nutzerverwaltung',
|
||||||
@@ -347,9 +345,13 @@ const de: Translation = {
|
|||||||
SYSTEM_NAME: 'Systemname',
|
SYSTEM_NAME: 'Systemname',
|
||||||
COMMANDS: 'Befehle',
|
COMMANDS: 'Befehle',
|
||||||
COMMANDS_HELP_1: 'Definieren Sie eigene Befehle für die EMS-Magistral',
|
COMMANDS_HELP_1: 'Definieren Sie eigene Befehle für die EMS-Magistral',
|
||||||
COMMAND_SENT: 'Befehl gesendet',
|
COMMAND_EXECUTED: 'Befehl erfolgreich ausgeführt',
|
||||||
RUN: 'Befehl ausführen',
|
RUN: 'Befehl ausführen',
|
||||||
INTERNET_CONNECTION_CHECK: 'Online-Prüfung auf verfügbare Versionen'
|
INTERNET_CONNECTION_CHECK: 'Online-Prüfung auf verfügbare Versionen',
|
||||||
|
UPLOAD_BACKUP_TEXT: 'Klicken Sie, um eine Sicherungsdatei (.json) auszuwählen oder zu ziehen und abzulegen',
|
||||||
|
UPLOAD_FIRMWARE_TEXT: 'Klicken Sie, um eine Firmware-Datei (.bin/.md5) auszuwählen oder zu ziehen und abzulegen',
|
||||||
|
UPLOAD_MD5_RECEIVED: 'Prüfsumme empfangen, jetzt die Firmware-Datei (.bin) hochladen',
|
||||||
|
UPLOAD_MD5_MATCHED: 'MD5 stimmt überein, Firmware wird installiert...'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default de;
|
export default de;
|
||||||
|
|||||||
@@ -178,8 +178,6 @@ const en: Translation = {
|
|||||||
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 values',
|
||||||
DOWNLOAD_SYSTEM_BACKUP: 'System Backup',
|
DOWNLOAD_SYSTEM_BACKUP: 'System Backup',
|
||||||
UPLOAD_TEXT: 'Upload a new firmware file (.bin) or a backup file (.json)',
|
|
||||||
UPLOAD_DROP_TEXT: 'Drop a firmware .bin file or click here',
|
|
||||||
ERROR: 'Unexpected Error, please try again',
|
ERROR: 'Unexpected Error, please try again',
|
||||||
TIME_SET: 'Time set',
|
TIME_SET: 'Time set',
|
||||||
MANAGE_USERS: 'Manage Users',
|
MANAGE_USERS: 'Manage Users',
|
||||||
@@ -347,9 +345,13 @@ const en: Translation = {
|
|||||||
SYSTEM_NAME: 'System Name',
|
SYSTEM_NAME: 'System Name',
|
||||||
COMMANDS: 'Commands',
|
COMMANDS: 'Commands',
|
||||||
COMMANDS_HELP_1: 'Define reusable named commands below. These can be executed from the console, API/MQTT, or referenced by the Scheduler',
|
COMMANDS_HELP_1: 'Define reusable named commands below. These can be executed from the console, API/MQTT, or referenced by the Scheduler',
|
||||||
COMMAND_SENT: 'Command sent',
|
COMMAND_EXECUTED: 'Command executed successfully',
|
||||||
RUN: 'Run',
|
RUN: 'Run',
|
||||||
INTERNET_CONNECTION_CHECK: 'Checking online for available versions'
|
INTERNET_CONNECTION_CHECK: 'Checking online for available versions',
|
||||||
|
UPLOAD_BACKUP_TEXT: 'Click to select or Drag&Drop a backup file (.json) here',
|
||||||
|
UPLOAD_FIRMWARE_TEXT: 'Click to select or Drag&Drop a firmware .bin/.md5 file',
|
||||||
|
UPLOAD_MD5_RECEIVED: 'Digest received, now upload the firmware .bin file',
|
||||||
|
UPLOAD_MD5_MATCHED: 'MD5 matches, installing firmware...'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default en;
|
export default en;
|
||||||
|
|||||||
@@ -178,8 +178,6 @@ const fr: Translation = {
|
|||||||
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 valeurs',
|
||||||
DOWNLOAD_SYSTEM_BACKUP: 'Sauvegarde système',
|
DOWNLOAD_SYSTEM_BACKUP: 'Sauvegarde système',
|
||||||
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',
|
|
||||||
ERROR: 'Erreur inattendue, veuillez réessayer',
|
ERROR: 'Erreur inattendue, veuillez réessayer',
|
||||||
TIME_SET: 'Time set',
|
TIME_SET: 'Time set',
|
||||||
MANAGE_USERS: 'Gérer les utilisateurs',
|
MANAGE_USERS: 'Gérer les utilisateurs',
|
||||||
@@ -347,9 +345,13 @@ const fr: Translation = {
|
|||||||
SYSTEM_NAME: 'Nom du système',
|
SYSTEM_NAME: 'Nom du système',
|
||||||
COMMANDS: 'Commandes',
|
COMMANDS: 'Commandes',
|
||||||
COMMANDS_HELP_1: 'Définir des commandes personnalisées pour la magistral EMS',
|
COMMANDS_HELP_1: 'Définir des commandes personnalisées pour la magistral EMS',
|
||||||
COMMAND_SENT: 'Commande envoyée',
|
COMMAND_EXECUTED: 'Commande exécutée avec succès',
|
||||||
RUN: 'Exécuter une commande',
|
RUN: 'Exécuter une commande',
|
||||||
INTERNET_CONNECTION_CHECK: 'Vérification en ligne pour les versions disponibles'
|
INTERNET_CONNECTION_CHECK: 'Vérification en ligne pour les versions disponibles',
|
||||||
|
UPLOAD_BACKUP_TEXT: 'Cliquez pour sélectionner ou faites glisser et déposez un fichier de sauvegarde (.json) ici',
|
||||||
|
UPLOAD_FIRMWARE_TEXT: 'Cliquez pour sélectionner ou faites glisser et déposez un fichier firmware .bin/.md5 ici',
|
||||||
|
UPLOAD_MD5_RECEIVED: 'Empreinte reçue, téléversez maintenant le fichier firmware .bin',
|
||||||
|
UPLOAD_MD5_MATCHED: 'MD5 concordant, installation du firmware...'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default fr;
|
export default fr;
|
||||||
|
|||||||
@@ -178,8 +178,6 @@ const it: Translation = {
|
|||||||
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 valori',
|
||||||
DOWNLOAD_SYSTEM_BACKUP: 'Backup sistema',
|
DOWNLOAD_SYSTEM_BACKUP: 'Backup sistema',
|
||||||
UPLOAD_TEXT: 'Upload a new firmware file (.bin) or a backup file (.json)',
|
|
||||||
UPLOAD_DROP_TEXT: 'Drop a firmware .bin file or click here',
|
|
||||||
ERROR: 'Errore Inaspettato, prego tenta ancora',
|
ERROR: 'Errore Inaspettato, prego tenta ancora',
|
||||||
TIME_SET: 'Imposta Ora',
|
TIME_SET: 'Imposta Ora',
|
||||||
MANAGE_USERS: 'Gestione Utenti',
|
MANAGE_USERS: 'Gestione Utenti',
|
||||||
@@ -347,9 +345,13 @@ const it: Translation = {
|
|||||||
SYSTEM_NAME: 'Nome del sistema',
|
SYSTEM_NAME: 'Nome del sistema',
|
||||||
COMMANDS: 'Comandi',
|
COMMANDS: 'Comandi',
|
||||||
COMMANDS_HELP_1: 'Definisci comandi personalizzati per la magistrali EMS',
|
COMMANDS_HELP_1: 'Definisci comandi personalizzati per la magistrali EMS',
|
||||||
COMMAND_SENT: 'Comando inviato',
|
COMMAND_EXECUTED: 'Comando eseguito con successo',
|
||||||
RUN: 'Esegui comando',
|
RUN: 'Esegui comando',
|
||||||
INTERNET_CONNECTION_CHECK: 'Controllo online per le versioni disponibili'
|
INTERNET_CONNECTION_CHECK: 'Controllo online per le versioni disponibili',
|
||||||
|
UPLOAD_BACKUP_TEXT: 'Klik per selezionare o trascinare e rilasciare un file di backup (.json) qui',
|
||||||
|
UPLOAD_FIRMWARE_TEXT: 'Klik per selezionare o trascinare e rilasciare un file firmware .bin/.md5 qui',
|
||||||
|
UPLOAD_MD5_RECEIVED: 'Digest ricevuto, ora caricare il file firmware .bin',
|
||||||
|
UPLOAD_MD5_MATCHED: 'MD5 corrispondente, installazione firmware...'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default it;
|
export default it;
|
||||||
|
|||||||
@@ -178,8 +178,6 @@ const nl: Translation = {
|
|||||||
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 waarden',
|
||||||
DOWNLOAD_SYSTEM_BACKUP: 'Systeem Backup',
|
DOWNLOAD_SYSTEM_BACKUP: 'Systeem Backup',
|
||||||
UPLOAD_TEXT: 'Upload een nieuw firmwarebestand (.bin) of een back-upbestand (.json)',
|
|
||||||
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: 'Gebruikersbeheer',
|
||||||
@@ -347,9 +345,13 @@ const nl: Translation = {
|
|||||||
SYSTEM_NAME: 'Systeemnaam',
|
SYSTEM_NAME: 'Systeemnaam',
|
||||||
COMMANDS: 'Commando\'s',
|
COMMANDS: 'Commando\'s',
|
||||||
COMMANDS_HELP_1: 'Definieer hergebruikbare benoemde commando\'s hieronder. Deze kunnen worden uitgevoerd vanuit de console, API/MQTT, of worden aangeroepen door de Scheduler',
|
COMMANDS_HELP_1: 'Definieer hergebruikbare benoemde commando\'s hieronder. Deze kunnen worden uitgevoerd vanuit de console, API/MQTT, of worden aangeroepen door de Scheduler',
|
||||||
COMMAND_SENT: 'Commando verzonden',
|
COMMAND_EXECUTED: 'Commando uitgevoerd succesvol',
|
||||||
RUN: 'Commando uitvoeren',
|
RUN: 'Commando uitvoeren',
|
||||||
INTERNET_CONNECTION_CHECK: 'Controleren op online beschikbare versies'
|
INTERNET_CONNECTION_CHECK: 'Controleren op online beschikbare versies',
|
||||||
|
UPLOAD_BACKUP_TEXT: 'Klik voor selecteren of sleep en drop een back-upbestand (.json) hier',
|
||||||
|
UPLOAD_FIRMWARE_TEXT: 'Klik voor selecteren of sleep en drop een firmware .bin/.md5 bestand hier',
|
||||||
|
UPLOAD_MD5_RECEIVED: 'Digest ontvangen, upload nu het firmware .bin-bestand',
|
||||||
|
UPLOAD_MD5_MATCHED: 'MD5 komt overeen, firmware wordt geïnstalleerd...'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default nl;
|
export default nl;
|
||||||
|
|||||||
@@ -178,8 +178,6 @@ const no: Translation = {
|
|||||||
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 verdier',
|
||||||
DOWNLOAD_SYSTEM_BACKUP: 'System Sikkerhetskopi',
|
DOWNLOAD_SYSTEM_BACKUP: 'System Sikkerhetskopi',
|
||||||
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',
|
|
||||||
ERROR: 'Ukjent feil, prøv igjen',
|
ERROR: 'Ukjent feil, prøv igjen',
|
||||||
TIME_SET: 'Still in tid',
|
TIME_SET: 'Still in tid',
|
||||||
MANAGE_USERS: 'Administrer Brukere',
|
MANAGE_USERS: 'Administrer Brukere',
|
||||||
@@ -347,9 +345,13 @@ const no: Translation = {
|
|||||||
SYSTEM_NAME: 'Systemnavn',
|
SYSTEM_NAME: 'Systemnavn',
|
||||||
COMMANDS: 'Kommandoer',
|
COMMANDS: 'Kommandoer',
|
||||||
COMMANDS_HELP_1: 'Definer egne kommandoer for EMS-Magistral',
|
COMMANDS_HELP_1: 'Definer egne kommandoer for EMS-Magistral',
|
||||||
COMMAND_SENT: 'Kommando sendt',
|
COMMAND_EXECUTED: 'Kommando kjørt lykkes',
|
||||||
RUN: 'Kjør',
|
RUN: 'Kjør',
|
||||||
INTERNET_CONNECTION_CHECK: 'Kontrollerer online for tilgjengelige versjoner'
|
INTERNET_CONNECTION_CHECK: 'Kontrollerer online for tilgjengelige versjoner',
|
||||||
|
UPLOAD_BACKUP_TEXT: 'Klikk for å velge eller dra og slipp en sikkerhetskopi (.json) her',
|
||||||
|
UPLOAD_FIRMWARE_TEXT: 'Klikk for å velge eller dra og slipp en firmware .bin/.md5 her',
|
||||||
|
UPLOAD_MD5_RECEIVED: 'MD5 mottatt, last nå opp firmware .bin-filen',
|
||||||
|
UPLOAD_MD5_MATCHED: 'MD5 stemmer, firmware installeres...'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default no;
|
export default no;
|
||||||
|
|||||||
@@ -178,8 +178,6 @@ const pl: BaseTranslation = {
|
|||||||
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 wartości',
|
||||||
DOWNLOAD_SYSTEM_BACKUP: 'Kopia zapasowa systemu',
|
DOWNLOAD_SYSTEM_BACKUP: 'Kopia zapasowa systemu',
|
||||||
UPLOAD_TEXT: 'Wgraj nowy plik firmware (.bin) lub kopię ustawień (.json)',
|
|
||||||
UPLOAD_DROP_TEXT: 'Upuść plik firmware .bin lub kliknij tutaj',
|
|
||||||
ERROR: 'Nieoczekiwany błąd, spróbuj ponownie!',
|
ERROR: 'Nieoczekiwany błąd, spróbuj ponownie!',
|
||||||
TIME_SET: 'Zegar został ustawiony.',
|
TIME_SET: 'Zegar został ustawiony.',
|
||||||
MANAGE_USERS: 'Zarządzanie użytkownikami',
|
MANAGE_USERS: 'Zarządzanie użytkownikami',
|
||||||
@@ -347,9 +345,13 @@ const pl: BaseTranslation = {
|
|||||||
SYSTEM_NAME: 'Nazwa systemu',
|
SYSTEM_NAME: 'Nazwa systemu',
|
||||||
COMMANDS: 'Komendy',
|
COMMANDS: 'Komendy',
|
||||||
COMMANDS_HELP_1: 'Zdefiniuj niestandardowe komendy dla magistrali EMS',
|
COMMANDS_HELP_1: 'Zdefiniuj niestandardowe komendy dla magistrali EMS',
|
||||||
COMMAND_SENT: 'Komenda wysłana',
|
COMMAND_EXECUTED: 'Komenda wykonana pomyślnie',
|
||||||
RUN: 'Wykonaj',
|
RUN: 'Wykonaj',
|
||||||
INTERNET_CONNECTION_CHECK: 'Sprawdzanie online dla dostępnych wersji'
|
INTERNET_CONNECTION_CHECK: 'Sprawdzanie online dla dostępnych wersji',
|
||||||
|
UPLOAD_BACKUP_TEXT: 'Kliknij, aby wybrać lub przeciągnij i upuść plik kopii zapasowej (.json) tutaj',
|
||||||
|
UPLOAD_FIRMWARE_TEXT: 'Kliknij, aby wybrać lub przeciągnij i upuść plik firmware .bin/.md5',
|
||||||
|
UPLOAD_MD5_RECEIVED: 'Suma MD5 odebrana, teraz wgraj plik firmware .bin',
|
||||||
|
UPLOAD_MD5_MATCHED: 'MD5 zgodne, instalowanie firmware...'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default pl;
|
export default pl;
|
||||||
|
|||||||
@@ -178,8 +178,6 @@ const sk: Translation = {
|
|||||||
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 hodnoty',
|
||||||
DOWNLOAD_SYSTEM_BACKUP: 'Systémová záloha',
|
DOWNLOAD_SYSTEM_BACKUP: 'Systémová záloha',
|
||||||
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',
|
|
||||||
ERROR: 'Neočakávaná chyba, prosím skúste to znova',
|
ERROR: 'Neočakávaná chyba, prosím skúste to znova',
|
||||||
TIME_SET: 'Nastavený čas',
|
TIME_SET: 'Nastavený čas',
|
||||||
MANAGE_USERS: 'Správa používateľov',
|
MANAGE_USERS: 'Správa používateľov',
|
||||||
@@ -347,9 +345,13 @@ const sk: Translation = {
|
|||||||
SYSTEM_NAME: 'Názov systému',
|
SYSTEM_NAME: 'Názov systému',
|
||||||
COMMANDS: 'Príkazy',
|
COMMANDS: 'Príkazy',
|
||||||
COMMANDS_HELP_1: 'Definujte vlastné príkazy pre magistrali EMS',
|
COMMANDS_HELP_1: 'Definujte vlastné príkazy pre magistrali EMS',
|
||||||
COMMAND_SENT: 'Príkaz odoslaný',
|
COMMAND_EXECUTED: 'Príkaz vykonaný úspešne',
|
||||||
RUN: 'Volať príkaz',
|
RUN: 'Volať príkaz',
|
||||||
INTERNET_CONNECTION_CHECK: 'Kontrola online pre dostupné verzie'
|
INTERNET_CONNECTION_CHECK: 'Kontrola online pre dostupné verzie',
|
||||||
|
UPLOAD_BACKUP_TEXT: 'Kliknite, aby ste vybrali alebo presuňte a upustili súbor zálohy (.json) sem',
|
||||||
|
UPLOAD_FIRMWARE_TEXT: 'Kliknite, aby ste vybrali alebo presuňte a upustili súbor firmware .bin/.md5',
|
||||||
|
UPLOAD_MD5_RECEIVED: 'Suma MD5 prijatá, teraz nahrajte firmware .bin',
|
||||||
|
UPLOAD_MD5_MATCHED: 'MD5 súhlasí, firmvér sa inštaluje...'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default sk;
|
export default sk;
|
||||||
|
|||||||
@@ -178,8 +178,6 @@ const sv: Translation = {
|
|||||||
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 värden',
|
||||||
DOWNLOAD_SYSTEM_BACKUP: 'System säkerhetskopia',
|
DOWNLOAD_SYSTEM_BACKUP: 'System säkerhetskopia',
|
||||||
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',
|
|
||||||
ERROR: 'Okänt fel, var god försök igen',
|
ERROR: 'Okänt fel, var god försök igen',
|
||||||
TIME_SET: 'Ställ in tid',
|
TIME_SET: 'Ställ in tid',
|
||||||
MANAGE_USERS: 'Användare',
|
MANAGE_USERS: 'Användare',
|
||||||
@@ -347,9 +345,13 @@ const sv: Translation = {
|
|||||||
SYSTEM_NAME: 'Systemnamn',
|
SYSTEM_NAME: 'Systemnamn',
|
||||||
COMMANDS: 'Kommandon',
|
COMMANDS: 'Kommandon',
|
||||||
COMMANDS_HELP_1: 'Definiera egna kommandon för EMS-Magistral',
|
COMMANDS_HELP_1: 'Definiera egna kommandon för EMS-Magistral',
|
||||||
COMMAND_SENT: 'Kommando skickat',
|
COMMAND_EXECUTED: 'Kommando kört lyckades',
|
||||||
RUN: 'Kör kommando',
|
RUN: 'Kör kommando',
|
||||||
INTERNET_CONNECTION_CHECK: 'Kontrollerar online för tillgängliga versioner'
|
INTERNET_CONNECTION_CHECK: 'Kontrollerar online för tillgängliga versioner',
|
||||||
|
UPLOAD_BACKUP_TEXT: 'Klicka för att välja eller dra och släpp en säkerhetskopia (.json) här',
|
||||||
|
UPLOAD_FIRMWARE_TEXT: 'Klicka för att välja eller dra och släpp en firmware .bin/.md5 här',
|
||||||
|
UPLOAD_MD5_RECEIVED: 'MD5 mottagen, ladda nu upp firmware .bin-filen',
|
||||||
|
UPLOAD_MD5_MATCHED: 'MD5 stämmer, firmware installeras...'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default sv;
|
export default sv;
|
||||||
|
|||||||
@@ -178,8 +178,6 @@ const tr: Translation = {
|
|||||||
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 değerleri dışarı al',
|
||||||
DOWNLOAD_SYSTEM_BACKUP: 'Sistem yedekleme',
|
DOWNLOAD_SYSTEM_BACKUP: 'Sistem yedekleme',
|
||||||
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',
|
|
||||||
ERROR: 'Beklenemedik hata, lütfen tekrar deneyin.',
|
ERROR: 'Beklenemedik hata, lütfen tekrar deneyin.',
|
||||||
TIME_SET: 'Zaman ayarı',
|
TIME_SET: 'Zaman ayarı',
|
||||||
MANAGE_USERS: 'Kullanıcıları yönet',
|
MANAGE_USERS: 'Kullanıcıları yönet',
|
||||||
@@ -347,9 +345,13 @@ const tr: Translation = {
|
|||||||
SYSTEM_NAME: 'Sistem Adı',
|
SYSTEM_NAME: 'Sistem Adı',
|
||||||
COMMANDS: 'Komutlar',
|
COMMANDS: 'Komutlar',
|
||||||
COMMANDS_HELP_1: 'Özel komutları EMS hattına tanımlayın',
|
COMMANDS_HELP_1: 'Özel komutları EMS hattına tanımlayın',
|
||||||
COMMAND_SENT: 'Komut gönderildi',
|
COMMAND_EXECUTED: 'Komut başarıyla çalıştırıldı',
|
||||||
RUN: 'Komutu çalıştır',
|
RUN: 'Komutu çalıştır',
|
||||||
INTERNET_CONNECTION_CHECK: 'Online bağlantısı kontrol ediliyor'
|
INTERNET_CONNECTION_CHECK: 'Online bağlantısı kontrol ediliyor',
|
||||||
|
UPLOAD_BACKUP_TEXT: 'Yeni bir firmware dosyası (.bin) veya yedek dosyası (.json) yükle',
|
||||||
|
UPLOAD_FIRMWARE_TEXT: 'Bir firmware .bin dosyası veya buraya tıklayın',
|
||||||
|
UPLOAD_MD5_RECEIVED: 'Özet alındı, şimdi firmware .bin dosyasını yükleyin',
|
||||||
|
UPLOAD_MD5_MATCHED: 'MD5 eşleşti, firmware yükleniyor...'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default tr;
|
export default tr;
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ export interface NetworkSettingsType {
|
|||||||
enableMDNS: boolean;
|
enableMDNS: boolean;
|
||||||
enableCORS: boolean;
|
enableCORS: boolean;
|
||||||
CORSOrigin: string;
|
CORSOrigin: string;
|
||||||
|
eth_10mbit: boolean;
|
||||||
[key: string]: unknown;
|
[key: string]: unknown;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,7 @@
|
|||||||
"assumeChangesOnlyAffectDirectDependencies": true,
|
"assumeChangesOnlyAffectDirectDependencies": true,
|
||||||
|
|
||||||
// Path mapping for cleaner imports
|
// Path mapping for cleaner imports
|
||||||
|
"ignoreDeprecations": "6.0",
|
||||||
"baseUrl": ".",
|
"baseUrl": ".",
|
||||||
"paths": {
|
"paths": {
|
||||||
"@/*": ["src/*"],
|
"@/*": ["src/*"],
|
||||||
|
|||||||
@@ -207,9 +207,6 @@ export default defineConfig(
|
|||||||
async ({ command, mode }: { command: string; mode: string }) => {
|
async ({ command, mode }: { command: string; mode: string }) => {
|
||||||
if (command === 'serve') {
|
if (command === 'serve') {
|
||||||
console.log(`Preparing for standalone build with server, mode=${mode}`);
|
console.log(`Preparing for standalone build with server, mode=${mode}`);
|
||||||
// Imported through a computed URL so the config bundler leaves it as a real
|
|
||||||
// runtime import: mock-api is a separate package with its own node_modules,
|
|
||||||
// and inlining it here would drag its dependencies into every build.
|
|
||||||
const mockServerUrl = pathToFileURL(
|
const mockServerUrl = pathToFileURL(
|
||||||
path.resolve(import.meta.dirname, '../mock-api/mockServer.js')
|
path.resolve(import.meta.dirname, '../mock-api/mockServer.js')
|
||||||
).href;
|
).href;
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
|
|
||||||
NativeConsole Serial;
|
NativeConsole Serial;
|
||||||
|
|
||||||
|
EspClass ESP;
|
||||||
ETHClass ETH;
|
ETHClass ETH;
|
||||||
WiFiClass WiFi;
|
WiFiClass WiFi;
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,15 @@
|
|||||||
#include "WString.h"
|
#include "WString.h"
|
||||||
#include "Network.h"
|
#include "Network.h"
|
||||||
|
|
||||||
|
// stub of Arduino-ESP32's EspClass, holding only what is called outside of #ifndef EMSESP_STANDALONE
|
||||||
|
class EspClass {
|
||||||
|
public:
|
||||||
|
size_t getPsramSize() {
|
||||||
|
return 0; // standalone has no PSRAM
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
extern EspClass ESP;
|
||||||
extern ETHClass ETH;
|
extern ETHClass ETH;
|
||||||
extern WiFiClass WiFi;
|
extern WiFiClass WiFi;
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ class DummySettings {
|
|||||||
// SYSTEM
|
// SYSTEM
|
||||||
bool bandwidth20 = false;
|
bool bandwidth20 = false;
|
||||||
bool nosleep = true;
|
bool nosleep = true;
|
||||||
|
bool eth_10mbit = false;
|
||||||
|
|
||||||
// MQTT
|
// MQTT
|
||||||
uint16_t publish_time = 10;
|
uint16_t publish_time = 10;
|
||||||
|
|||||||
@@ -41,6 +41,8 @@ class WiFiClient {
|
|||||||
}
|
}
|
||||||
void setTimeout(uint32_t){
|
void setTimeout(uint32_t){
|
||||||
|
|
||||||
|
}
|
||||||
|
void setConnectionTimeout(uint32_t) {
|
||||||
}
|
}
|
||||||
// ESP32 socket option passthrough (e.g. TCP_NODELAY)
|
// ESP32 socket option passthrough (e.g. TCP_NODELAY)
|
||||||
int setSocketOption(int, int, const void *, size_t) {
|
int setSocketOption(int, int, const void *, size_t) {
|
||||||
|
|||||||
+106
-115
@@ -1,27 +1,11 @@
|
|||||||
// Mock server for development
|
// EMS-ESP standalone mode to simulate
|
||||||
// Simulates file uploads and EventSource (SSE) for log messages
|
// a REST server for file uploads
|
||||||
import formidable from 'formidable';
|
// an EventSource (Server-Sent Events) for log messages in EMS-ESP standalone mode
|
||||||
|
|
||||||
// Constants reused across requests
|
|
||||||
const VALID_EXTENSIONS = new Set(['bin', 'json', 'md5']);
|
|
||||||
const ONE_SECOND_MS = 1000;
|
const ONE_SECOND_MS = 1000;
|
||||||
const TEN_PERCENT = 10;
|
|
||||||
|
|
||||||
// padding function
|
// padding function
|
||||||
const pad = (number) => String(number).padStart(2, '0');
|
const pad = (number) => String(number).padStart(2, '0');
|
||||||
|
|
||||||
// Simple throttle helper (time-based)
|
|
||||||
const throttle = (fn, intervalMs) => {
|
|
||||||
let last = 0;
|
|
||||||
return (...args) => {
|
|
||||||
const now = Date.now();
|
|
||||||
if (now - last >= intervalMs) {
|
|
||||||
last = now;
|
|
||||||
fn(...args);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
// Cached date formatter to avoid prototype pollution
|
// Cached date formatter to avoid prototype pollution
|
||||||
const formatDate = (date) => {
|
const formatDate = (date) => {
|
||||||
const year = date.getUTCFullYear();
|
const year = date.getUTCFullYear();
|
||||||
@@ -38,108 +22,115 @@ const formatDate = (date) => {
|
|||||||
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;
|
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const MOCK_REST_ORIGIN = 'http://localhost:3080';
|
||||||
|
const UPLOAD_SIMULATED_KB_PER_SEC = 256;
|
||||||
|
const UPLOAD_SLICE_BYTES = 16 * 1024;
|
||||||
|
|
||||||
|
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
||||||
|
|
||||||
|
const readRequestThrottled = (req) =>
|
||||||
|
new Promise((resolve, reject) => {
|
||||||
|
const chunks = [];
|
||||||
|
let ended = false;
|
||||||
|
let settled = false;
|
||||||
|
|
||||||
|
const settle = (settler, value) => {
|
||||||
|
if (settled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
settled = true;
|
||||||
|
settler(value);
|
||||||
|
};
|
||||||
|
|
||||||
|
req.on('error', (error) => settle(reject, error));
|
||||||
|
req.on('end', () => {
|
||||||
|
ended = true;
|
||||||
|
void step();
|
||||||
|
});
|
||||||
|
|
||||||
|
const step = async () => {
|
||||||
|
if (settled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const chunk = req.read(UPLOAD_SLICE_BYTES);
|
||||||
|
if (chunk) {
|
||||||
|
chunks.push(chunk);
|
||||||
|
await sleep((chunk.length / (UPLOAD_SIMULATED_KB_PER_SEC * 1024)) * 1000);
|
||||||
|
void step();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (ended || req.readableEnded) {
|
||||||
|
settle(resolve, Buffer.concat(chunks));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
req.once('readable', () => {
|
||||||
|
void step();
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
settle(reject, error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void step();
|
||||||
|
});
|
||||||
|
|
||||||
|
const forwardThrottledUpload = async (req, res) => {
|
||||||
|
const startedAt = Date.now();
|
||||||
|
try {
|
||||||
|
const body = await readRequestThrottled(req);
|
||||||
|
console.log(
|
||||||
|
`Upload received: ${body.length} bytes in ${((Date.now() - startedAt) / 1000).toFixed(1)}s`
|
||||||
|
);
|
||||||
|
const headers = {};
|
||||||
|
if (req.headers['content-type']) {
|
||||||
|
headers['content-type'] = req.headers['content-type'];
|
||||||
|
}
|
||||||
|
if (req.headers.authorization) {
|
||||||
|
headers.authorization = req.headers.authorization;
|
||||||
|
}
|
||||||
|
headers['content-length'] = String(body.length);
|
||||||
|
|
||||||
|
const bunRes = await fetch(`${MOCK_REST_ORIGIN}${req.url}`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers,
|
||||||
|
body
|
||||||
|
});
|
||||||
|
const buf = Buffer.from(await bunRes.arrayBuffer());
|
||||||
|
res.statusCode = bunRes.status;
|
||||||
|
bunRes.headers.forEach((value, key) => {
|
||||||
|
if (key !== 'transfer-encoding' && key !== 'content-encoding') {
|
||||||
|
res.setHeader(key, value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
res.end(buf);
|
||||||
|
} catch (error) {
|
||||||
|
if (error?.code === 'ECONNRESET' || req.destroyed) {
|
||||||
|
console.log('Upload cancelled by the client');
|
||||||
|
} else {
|
||||||
|
console.error('Throttled upload proxy failed', error);
|
||||||
|
}
|
||||||
|
if (!res.headersSent) {
|
||||||
|
res.statusCode = 502;
|
||||||
|
}
|
||||||
|
if (!res.writableEnded) {
|
||||||
|
res.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
export default () => {
|
export default () => {
|
||||||
return {
|
return {
|
||||||
name: 'vite:mockserver',
|
name: 'vite:mockServer',
|
||||||
configureServer: async (server) => {
|
configureServer: async (server) => {
|
||||||
server.middlewares.use(async (req, res, next) => {
|
server.middlewares.use(async (req, res, next) => {
|
||||||
// Handle file uploads
|
if (req.url.startsWith('/rest/uploadFile') && req.method === 'POST') {
|
||||||
if (req.url.startsWith('/rest/uploadFile')) {
|
await forwardThrottledUpload(req, res);
|
||||||
// CORS preflight support
|
return;
|
||||||
if (req.method === 'OPTIONS') {
|
|
||||||
res.writeHead(204, {
|
|
||||||
'Access-Control-Allow-Origin': '*',
|
|
||||||
'Access-Control-Allow-Methods': 'POST, OPTIONS',
|
|
||||||
'Access-Control-Allow-Headers': 'Content-Type, Cache-Control',
|
|
||||||
'Access-Control-Max-Age': '600'
|
|
||||||
});
|
|
||||||
res.end();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (req.method !== 'POST') {
|
|
||||||
res.statusCode = 405;
|
|
||||||
res.setHeader('Allow', 'POST, OPTIONS');
|
|
||||||
res.end('Method Not Allowed');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const fileSize = parseInt(req.headers['content-length'] || '0', 10);
|
|
||||||
let progress = 0;
|
|
||||||
|
|
||||||
// Track upload progress
|
|
||||||
const logThrottled = throttle((percentage) => {
|
|
||||||
console.log(`Upload progress: ${percentage}%`);
|
|
||||||
}, ONE_SECOND_MS);
|
|
||||||
|
|
||||||
req.on('data', (chunk) => {
|
|
||||||
progress += chunk.length;
|
|
||||||
if (fileSize > 0) {
|
|
||||||
const percentage = Math.round((progress / fileSize) * 100);
|
|
||||||
// Only log every ~1s and for meaningful changes (>=10%)
|
|
||||||
if (percentage % TEN_PERCENT === 0) {
|
|
||||||
logThrottled(percentage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
try {
|
|
||||||
const form = formidable({
|
|
||||||
maxFileSize: 50 * 1024 * 1024, // 50MB limit
|
|
||||||
keepExtensions: true,
|
|
||||||
multiples: false,
|
|
||||||
allowEmptyFiles: false
|
|
||||||
});
|
|
||||||
|
|
||||||
const [fields, files] = await form.parse(req);
|
|
||||||
|
|
||||||
if (Object.keys(files).length === 0) {
|
|
||||||
res.statusCode = 400;
|
|
||||||
res.end('No file uploaded');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const uploadedFile = Array.isArray(files.file)
|
|
||||||
? files.file[0]
|
|
||||||
: files.file;
|
|
||||||
const fileName = uploadedFile.originalFilename;
|
|
||||||
const fileExtension = fileName
|
|
||||||
.substring(fileName.lastIndexOf('.') + 1)
|
|
||||||
.toLowerCase();
|
|
||||||
|
|
||||||
console.log(
|
|
||||||
`File uploaded: ${fileName} (${fileExtension}, ${fileSize} bytes)`
|
|
||||||
);
|
|
||||||
|
|
||||||
// Validate file extension
|
|
||||||
if (!VALID_EXTENSIONS.has(fileExtension)) {
|
|
||||||
res.statusCode = 406;
|
|
||||||
res.end('Invalid file extension');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle different file types
|
|
||||||
if (fileExtension === 'md5') {
|
|
||||||
res.setHeader('Content-Type', 'application/json');
|
|
||||||
res.end(
|
|
||||||
JSON.stringify({
|
|
||||||
md5: 'ef4304fc4d9025a58dcf25d71c882d2c'
|
|
||||||
})
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
console.log('File uploaded successfully!');
|
|
||||||
res.end();
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
console.error('Upload error:', err && err.message ? err.message : err);
|
|
||||||
res.statusCode = err.httpCode || 400;
|
|
||||||
res.setHeader('Content-Type', 'text/plain');
|
|
||||||
res.end(err && err.message ? err.message : 'Upload error');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle Server-Sent Events (SSE) for log streaming
|
// Handle Server-Sent Events (SSE) for log streaming
|
||||||
else if (req.url.startsWith('/es/log')) {
|
if (req.url.startsWith('/es/log')) {
|
||||||
// Set SSE headers
|
// Set SSE headers
|
||||||
res.writeHead(200, {
|
res.writeHead(200, {
|
||||||
Connection: 'keep-alive',
|
Connection: 'keep-alive',
|
||||||
@@ -210,7 +201,7 @@ export default () => {
|
|||||||
res.on('error', cleanup);
|
res.on('error', cleanup);
|
||||||
res.on('finish', cleanup);
|
res.on('finish', cleanup);
|
||||||
} else {
|
} else {
|
||||||
next(); // Continue to next middleware
|
next(); // Continue to next middleware (Vite proxy → restServer)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,12 +11,11 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@msgpack/msgpack": "^3.1.3",
|
"@msgpack/msgpack": "^3.1.3",
|
||||||
"formidable": "^3.5.4",
|
|
||||||
"itty-router": "^5.0.24"
|
"itty-router": "^5.0.24"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
|
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
|
||||||
"prettier": "^3.9.6"
|
"prettier": "^3.9.6"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@11.24.0+sha512.bd27e345e976dcb0be0b7a1228217b049a817e21b1f355c90dbe7dc46671895a8bc1e6d06c24554505ea93ea0b45f489a27ec1bfbc8de6a9659fca0f16fa0000"
|
"packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457"
|
||||||
}
|
}
|
||||||
|
|||||||
Generated
+106
-56
@@ -1,3 +1,104 @@
|
|||||||
|
---
|
||||||
|
lockfileVersion: '9.0'
|
||||||
|
|
||||||
|
importers:
|
||||||
|
|
||||||
|
.:
|
||||||
|
configDependencies: {}
|
||||||
|
packageManagerDependencies:
|
||||||
|
pnpm:
|
||||||
|
specifier: 12.3.4
|
||||||
|
version: 12.3.4
|
||||||
|
|
||||||
|
packages:
|
||||||
|
|
||||||
|
'@pnpm/exe.darwin-arm64@12.3.4':
|
||||||
|
resolution: {integrity: sha512-PAyUol8T1+/+ViOiXAt51ECA+QnfXCqz6foL4bW+LsoX0NcVd5XVEM2mRQu+LV4oc7uRz9zf9U0P+XFfuQeDAw==}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [darwin]
|
||||||
|
|
||||||
|
'@pnpm/exe.darwin-x64@12.3.4':
|
||||||
|
resolution: {integrity: sha512-fxP9JCk0Cdye+ePuj+GJJLMUMTqHGWRdb1dtv4How876uQ2ehxvenpgiYAir/ceO9PsYUZkFTtyZdx+rRu5QOA==}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [darwin]
|
||||||
|
|
||||||
|
'@pnpm/exe.linux-arm64-musl@12.3.4':
|
||||||
|
resolution: {integrity: sha512-FBOt0/7ye6O6q4AllVV5QMviB6qE6fqkeczV/+MDWQsmo+QJrlfsh6X7CpH/tClVpBZEyIbjpUoT8bNhCYBxEg==}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [linux]
|
||||||
|
libc: [musl]
|
||||||
|
|
||||||
|
'@pnpm/exe.linux-arm64@12.3.4':
|
||||||
|
resolution: {integrity: sha512-t71AVA7LRqiKTyZ5xMYaZc2n5DfdpMbfokZuiIOXHBOM03ECnF0t4iYwaBDqJgVjlKYUOwaF/bRQajGNA4cJ4w==}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [linux]
|
||||||
|
libc: [glibc]
|
||||||
|
|
||||||
|
'@pnpm/exe.linux-x64-musl@12.3.4':
|
||||||
|
resolution: {integrity: sha512-RPmk7Jb/aYaFvL2iyDN/AtMY+hUEsue732WmXpcuQ9tBpMnGyA5py7Z3+e+qmQaJ0zY/4ni9jJiyPBQHujmv6w==}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [linux]
|
||||||
|
libc: [musl]
|
||||||
|
|
||||||
|
'@pnpm/exe.linux-x64@12.3.4':
|
||||||
|
resolution: {integrity: sha512-2ZqOlSPkfwX1h5cR+FPiWf8+F+2hZT/3TvhUK5sigHqwaQCIiq8R7CGxhndKs63JtcLi2a1Qpo+wX/EoyfjyJQ==}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [linux]
|
||||||
|
libc: [glibc]
|
||||||
|
|
||||||
|
'@pnpm/exe.win32-arm64@12.3.4':
|
||||||
|
resolution: {integrity: sha512-ANyrHqyqco6SXBysUTRF74itDyyraea7IbFsKFdNXTjcFnfycTDx37EwuhdpPYFNSIh2JhUG4fByclsRfiHX7w==}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [win32]
|
||||||
|
|
||||||
|
'@pnpm/exe.win32-x64@12.3.4':
|
||||||
|
resolution: {integrity: sha512-WH/KqBPY/hq2Tb7SgQltEZytimcjgKRaCRL/aM9CI0c67iKc5TVmHUhIiL3Ux9FB4bWn36i6XewUcScQI+zG8w==}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [win32]
|
||||||
|
|
||||||
|
pnpm@12.3.4:
|
||||||
|
resolution: {integrity: sha512-lhqkH7B32joEpEHZ+OFevAyW2o73ELLrZ7+e58sGEOq9SPH9hfUc/+c4RnhfoPh8VqOocqHYk/hEZ0G1zORUVw==}
|
||||||
|
engines: {node: '>=18.*'}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
|
snapshots:
|
||||||
|
|
||||||
|
'@pnpm/exe.darwin-arm64@12.3.4':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@pnpm/exe.darwin-x64@12.3.4':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@pnpm/exe.linux-arm64-musl@12.3.4':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@pnpm/exe.linux-arm64@12.3.4':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@pnpm/exe.linux-x64-musl@12.3.4':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@pnpm/exe.linux-x64@12.3.4':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@pnpm/exe.win32-arm64@12.3.4':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@pnpm/exe.win32-x64@12.3.4':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
pnpm@12.3.4:
|
||||||
|
optionalDependencies:
|
||||||
|
'@pnpm/exe.darwin-arm64': 12.3.4
|
||||||
|
'@pnpm/exe.darwin-x64': 12.3.4
|
||||||
|
'@pnpm/exe.linux-arm64': 12.3.4
|
||||||
|
'@pnpm/exe.linux-arm64-musl': 12.3.4
|
||||||
|
'@pnpm/exe.linux-x64': 12.3.4
|
||||||
|
'@pnpm/exe.linux-x64-musl': 12.3.4
|
||||||
|
'@pnpm/exe.win32-arm64': 12.3.4
|
||||||
|
'@pnpm/exe.win32-x64': 12.3.4
|
||||||
|
|
||||||
|
---
|
||||||
lockfileVersion: '9.0'
|
lockfileVersion: '9.0'
|
||||||
|
|
||||||
settings:
|
settings:
|
||||||
@@ -11,9 +112,6 @@ importers:
|
|||||||
'@msgpack/msgpack':
|
'@msgpack/msgpack':
|
||||||
specifier: ^3.1.3
|
specifier: ^3.1.3
|
||||||
version: 3.1.3
|
version: 3.1.3
|
||||||
formidable:
|
|
||||||
specifier: ^3.5.4
|
|
||||||
version: 3.5.4
|
|
||||||
itty-router:
|
itty-router:
|
||||||
specifier: ^5.0.24
|
specifier: ^5.0.24
|
||||||
version: 5.0.24
|
version: 5.0.24
|
||||||
@@ -71,8 +169,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
|
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
|
||||||
engines: {node: '>=6.0.0'}
|
engines: {node: '>=6.0.0'}
|
||||||
|
|
||||||
'@jridgewell/sourcemap-codec@1.5.5':
|
'@jridgewell/sourcemap-codec@1.6.0':
|
||||||
resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
|
resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==}
|
||||||
|
|
||||||
'@jridgewell/trace-mapping@0.3.31':
|
'@jridgewell/trace-mapping@0.3.31':
|
||||||
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
|
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
|
||||||
@@ -81,13 +179,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-47XIizs9XZXvuJgoaJUIE2lFoID8ugvc0jzSHP+Ptfk8nTbnR8g788wv48N03Kx0UkAv559HWRQ3yzOgzlRNUA==}
|
resolution: {integrity: sha512-47XIizs9XZXvuJgoaJUIE2lFoID8ugvc0jzSHP+Ptfk8nTbnR8g788wv48N03Kx0UkAv559HWRQ3yzOgzlRNUA==}
|
||||||
engines: {node: '>= 18'}
|
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':
|
'@trivago/prettier-plugin-sort-imports@6.0.2':
|
||||||
resolution: {integrity: sha512-3DgfkukFyC/sE/VuYjaUUWoFfuVjPK55vOFDsxD56XXynFMCZDYFogH2l/hDfOsQAm1myoU/1xByJ3tWqtulXA==}
|
resolution: {integrity: sha512-3DgfkukFyC/sE/VuYjaUUWoFfuVjPK55vOFDsxD56XXynFMCZDYFogH2l/hDfOsQAm1myoU/1xByJ3tWqtulXA==}
|
||||||
engines: {node: '>= 20'}
|
engines: {node: '>= 20'}
|
||||||
@@ -107,9 +198,6 @@ packages:
|
|||||||
svelte:
|
svelte:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
asap@2.0.6:
|
|
||||||
resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
|
|
||||||
|
|
||||||
balanced-match@1.0.2:
|
balanced-match@1.0.2:
|
||||||
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
||||||
|
|
||||||
@@ -125,13 +213,6 @@ packages:
|
|||||||
supports-color:
|
supports-color:
|
||||||
optional: true
|
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.24:
|
itty-router@5.0.24:
|
||||||
resolution: {integrity: sha512-PXij1qGKtE6jg3dLgrTRdh/Frovl5Wc4Av67sD2xfhDPrgNt4u79++/il8/c/OfZGkhD/8uYJub8tjo+H165rA==}
|
resolution: {integrity: sha512-PXij1qGKtE6jg3dLgrTRdh/Frovl5Wc4Av67sD2xfhDPrgNt4u79++/il8/c/OfZGkhD/8uYJub8tjo+H165rA==}
|
||||||
|
|
||||||
@@ -156,9 +237,6 @@ packages:
|
|||||||
ms@2.1.3:
|
ms@2.1.3:
|
||||||
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
|
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:
|
parse-imports-exports@0.2.4:
|
||||||
resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==}
|
resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==}
|
||||||
|
|
||||||
@@ -173,9 +251,6 @@ packages:
|
|||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
wrappy@1.0.2:
|
|
||||||
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
|
|
||||||
|
|
||||||
snapshots:
|
snapshots:
|
||||||
|
|
||||||
'@babel/code-frame@7.29.7':
|
'@babel/code-frame@7.29.7':
|
||||||
@@ -227,26 +302,20 @@ snapshots:
|
|||||||
|
|
||||||
'@jridgewell/gen-mapping@0.3.13':
|
'@jridgewell/gen-mapping@0.3.13':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@jridgewell/sourcemap-codec': 1.5.5
|
'@jridgewell/sourcemap-codec': 1.6.0
|
||||||
'@jridgewell/trace-mapping': 0.3.31
|
'@jridgewell/trace-mapping': 0.3.31
|
||||||
|
|
||||||
'@jridgewell/resolve-uri@3.1.2': {}
|
'@jridgewell/resolve-uri@3.1.2': {}
|
||||||
|
|
||||||
'@jridgewell/sourcemap-codec@1.5.5': {}
|
'@jridgewell/sourcemap-codec@1.6.0': {}
|
||||||
|
|
||||||
'@jridgewell/trace-mapping@0.3.31':
|
'@jridgewell/trace-mapping@0.3.31':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@jridgewell/resolve-uri': 3.1.2
|
'@jridgewell/resolve-uri': 3.1.2
|
||||||
'@jridgewell/sourcemap-codec': 1.5.5
|
'@jridgewell/sourcemap-codec': 1.6.0
|
||||||
|
|
||||||
'@msgpack/msgpack@3.1.3': {}
|
'@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.9.6)':
|
'@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.9.6)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/generator': 7.29.8
|
'@babel/generator': 7.29.8
|
||||||
@@ -261,8 +330,6 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
asap@2.0.6: {}
|
|
||||||
|
|
||||||
balanced-match@1.0.2: {}
|
balanced-match@1.0.2: {}
|
||||||
|
|
||||||
brace-expansion@2.1.4:
|
brace-expansion@2.1.4:
|
||||||
@@ -273,17 +340,6 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
ms: 2.1.3
|
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.24: {}
|
itty-router@5.0.24: {}
|
||||||
|
|
||||||
javascript-natural-sort@0.7.1: {}
|
javascript-natural-sort@0.7.1: {}
|
||||||
@@ -300,10 +356,6 @@ snapshots:
|
|||||||
|
|
||||||
ms@2.1.3: {}
|
ms@2.1.3: {}
|
||||||
|
|
||||||
once@1.4.0:
|
|
||||||
dependencies:
|
|
||||||
wrappy: 1.0.2
|
|
||||||
|
|
||||||
parse-imports-exports@0.2.4:
|
parse-imports-exports@0.2.4:
|
||||||
dependencies:
|
dependencies:
|
||||||
parse-statements: 1.0.11
|
parse-statements: 1.0.11
|
||||||
@@ -313,5 +365,3 @@ snapshots:
|
|||||||
picocolors@1.1.1: {}
|
picocolors@1.1.1: {}
|
||||||
|
|
||||||
prettier@3.9.6: {}
|
prettier@3.9.6: {}
|
||||||
|
|
||||||
wrappy@1.0.2: {}
|
|
||||||
|
|||||||
+78
-11
@@ -65,7 +65,16 @@ let settings = {
|
|||||||
modbus_max_clients: 10,
|
modbus_max_clients: 10,
|
||||||
modbus_timeout: 10000,
|
modbus_timeout: 10000,
|
||||||
developer_mode: true,
|
developer_mode: true,
|
||||||
disable_reset: false
|
disable_reset: false,
|
||||||
|
email_enabled: false,
|
||||||
|
email_security: 2,
|
||||||
|
email_server: 'smtp.gmail.com',
|
||||||
|
email_port: 587,
|
||||||
|
email_login: 'test@emsesp.org',
|
||||||
|
email_pass: 'password',
|
||||||
|
email_sender: 'test@emsesp.org',
|
||||||
|
email_recp: 'test@emsesp.org',
|
||||||
|
email_subject: 'ems-esp notification'
|
||||||
};
|
};
|
||||||
|
|
||||||
// EMS-ESP System Settings
|
// EMS-ESP System Settings
|
||||||
@@ -86,9 +95,9 @@ let system_status = {
|
|||||||
// network_status: 10, // ethernet connected
|
// network_status: 10, // ethernet connected
|
||||||
// network_status: 6, // wifi disconnected
|
// network_status: 6, // wifi disconnected
|
||||||
wifi_rssi: -41,
|
wifi_rssi: -41,
|
||||||
esp_platform: 'ESP32S3',
|
esp_platform: 'ESP32',
|
||||||
build_flags: 'DEMO',
|
build_flags: 'DEMO',
|
||||||
cpu_type: 'ESP32-S3',
|
cpu_type: 'ESP32',
|
||||||
cpu_rev: 0,
|
cpu_rev: 0,
|
||||||
cpu_cores: 2,
|
cpu_cores: 2,
|
||||||
cpu_freq_mhz: 240,
|
cpu_freq_mhz: 240,
|
||||||
@@ -193,8 +202,8 @@ system_status.partitions[0].version = THIS_VERSION; // app0
|
|||||||
|
|
||||||
// set the ESP platform - using ESP32 will disable OTA and automatic version downloading
|
// set the ESP platform - using ESP32 will disable OTA and automatic version downloading
|
||||||
let emulate_esp: string;
|
let emulate_esp: string;
|
||||||
emulate_esp = 'ESP32S3';
|
// emulate_esp = 'ESP32S3';
|
||||||
// emulate_esp = 'ESP32';
|
emulate_esp = 'ESP32';
|
||||||
|
|
||||||
switch (emulate_esp) {
|
switch (emulate_esp) {
|
||||||
// ESP32 4MB
|
// ESP32 4MB
|
||||||
@@ -230,6 +239,17 @@ switch (emulate_esp) {
|
|||||||
// GLOBAL VARIABLES
|
// GLOBAL VARIABLES
|
||||||
let countWifiScanPoll = 0; // wifi network scan
|
let countWifiScanPoll = 0; // wifi network scan
|
||||||
let countHardwarePoll = 0; // for during an upload
|
let countHardwarePoll = 0; // for during an upload
|
||||||
|
let pendingFirmwareMd5 = false; // set by a .md5 upload, cleared by the next .bin
|
||||||
|
|
||||||
|
const VALID_UPLOAD_EXTENSIONS = new Set(['bin', 'json', 'md5']);
|
||||||
|
|
||||||
|
function parseMd5Digest(text: string): string | null {
|
||||||
|
const token = text.trim().split(/\s+/)[0];
|
||||||
|
if (/^[0-9a-fA-F]{32}$/.test(token)) {
|
||||||
|
return token.toLowerCase();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
// DeviceTypes
|
// DeviceTypes
|
||||||
const enum ScheduleFlag {
|
const enum ScheduleFlag {
|
||||||
@@ -425,16 +445,20 @@ function upgradeImportantMessages(version: string) {
|
|||||||
// 0 is do nothing
|
// 0 is do nothing
|
||||||
// 1 means 3.9 and factory reset required
|
// 1 means 3.9 and factory reset required
|
||||||
// 2 means a major version upgrade
|
// 2 means a major version upgrade
|
||||||
|
|
||||||
let upgradeImportantMessageType_n = 0;
|
let upgradeImportantMessageType_n = 0;
|
||||||
|
|
||||||
// see if its a filename with a .bin extension
|
// check file extensions
|
||||||
if (version.endsWith('.bin')) {
|
if (version.endsWith('.md5') || version.endsWith('.json')) {
|
||||||
upgradeImportantMessageType_n = 1; // make it 1, for testing, meaning factory reset required
|
upgradeImportantMessageType_n = 0; // digest / backup restore: no upgrade warning
|
||||||
} else if (version.endsWith('.md')) {
|
} else if (version.endsWith('.bin')) {
|
||||||
upgradeImportantMessageType_n = 0; // use default 0, no message
|
// extract the version number from the filename and if its going from 3.8.x to 3.9.x, then set upgradeImportantMessageType_n to 1
|
||||||
|
const versionNumber = version.split('.');
|
||||||
|
if (versionNumber[0] === '3' && versionNumber[1] === '8') {
|
||||||
|
upgradeImportantMessageType_n = 1; // make it 1, factory reset required
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// this is a version string like "3.9.0"
|
// this is a version string like "3.9.0"
|
||||||
// upgradeImportantMessageType_n = 2; // make it 2, for testing, meaning a major version upgrade
|
|
||||||
upgradeImportantMessageType_n = 1; // make it 1, for testing, meaning a factory reset is required
|
upgradeImportantMessageType_n = 1; // make it 1, for testing, meaning a factory reset is required
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -573,6 +597,7 @@ let network_settings = {
|
|||||||
enableMDNS: true,
|
enableMDNS: true,
|
||||||
enableCORS: false,
|
enableCORS: false,
|
||||||
CORSOrigin: '*',
|
CORSOrigin: '*',
|
||||||
|
eth_10mbit: false,
|
||||||
local_ip: '',
|
local_ip: '',
|
||||||
gateway_ip: '',
|
gateway_ip: '',
|
||||||
subnet_mask: '',
|
subnet_mask: '',
|
||||||
@@ -764,6 +789,7 @@ const EMSESP_COMMANDS_ENDPOINT = REST_ENDPOINT_ROOT + 'commands';
|
|||||||
const EMSESP_CUSTOMENTITIES_ENDPOINT = REST_ENDPOINT_ROOT + 'customEntities';
|
const EMSESP_CUSTOMENTITIES_ENDPOINT = REST_ENDPOINT_ROOT + 'customEntities';
|
||||||
const EMSESP_MODULES_ENDPOINT = REST_ENDPOINT_ROOT + 'modules';
|
const EMSESP_MODULES_ENDPOINT = REST_ENDPOINT_ROOT + 'modules';
|
||||||
const EMSESP_ACTION_ENDPOINT = REST_ENDPOINT_ROOT + 'action';
|
const EMSESP_ACTION_ENDPOINT = REST_ENDPOINT_ROOT + 'action';
|
||||||
|
const EMSESP_UPLOAD_FILE_ENDPOINT = REST_ENDPOINT_ROOT + 'uploadFile';
|
||||||
|
|
||||||
// these are used in the API calls only
|
// these are used in the API calls only
|
||||||
const EMSESP_SYSTEM_INFO_ENDPOINT = API_ENDPOINT_ROOT + 'system/info';
|
const EMSESP_SYSTEM_INFO_ENDPOINT = API_ENDPOINT_ROOT + 'system/info';
|
||||||
@@ -4627,6 +4653,47 @@ router
|
|||||||
|
|
||||||
// SYSTEM and SETTINGS
|
// SYSTEM and SETTINGS
|
||||||
router
|
router
|
||||||
|
.post(EMSESP_UPLOAD_FILE_ENDPOINT, async (request: Request) => {
|
||||||
|
const formData = await request.formData();
|
||||||
|
const uploaded = formData.get('file');
|
||||||
|
if (!uploaded || typeof uploaded === 'string') {
|
||||||
|
return status(400);
|
||||||
|
}
|
||||||
|
|
||||||
|
const fileName = uploaded.name || '';
|
||||||
|
const fileExtension = fileName.includes('.')
|
||||||
|
? fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase()
|
||||||
|
: '';
|
||||||
|
console.log(
|
||||||
|
`File uploaded: ${fileName} (${fileExtension}, ${uploaded.size} bytes)`
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!VALID_UPLOAD_EXTENSIONS.has(fileExtension)) {
|
||||||
|
console.log('Invalid file extension');
|
||||||
|
return status(406);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fileExtension === 'md5') {
|
||||||
|
const digest = parseMd5Digest(await uploaded.text());
|
||||||
|
if (!digest) {
|
||||||
|
console.log('Invalid MD5 digest file');
|
||||||
|
return status(406);
|
||||||
|
}
|
||||||
|
pendingFirmwareMd5 = true;
|
||||||
|
console.log('MD5 digest received', digest);
|
||||||
|
return { md5: digest };
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fileExtension === 'bin' && pendingFirmwareMd5) {
|
||||||
|
pendingFirmwareMd5 = false;
|
||||||
|
console.log('Firmware MD5 matches');
|
||||||
|
return { md5_ok: true };
|
||||||
|
}
|
||||||
|
|
||||||
|
pendingFirmwareMd5 = false;
|
||||||
|
console.log('File uploaded successfully!');
|
||||||
|
return status(200);
|
||||||
|
})
|
||||||
.get(ACTIVITY_ENDPOINT, () => activity)
|
.get(ACTIVITY_ENDPOINT, () => activity)
|
||||||
.get(SYSTEM_STATUS_ENDPOINT, async () => {
|
.get(SYSTEM_STATUS_ENDPOINT, async () => {
|
||||||
if (countHardwarePoll >= 2) {
|
if (countHardwarePoll >= 2) {
|
||||||
|
|||||||
+7
-2
@@ -744,7 +744,7 @@ mlongcalls
|
|||||||
mmio
|
mmio
|
||||||
mmode
|
mmode
|
||||||
mmplus
|
mmplus
|
||||||
mockserver
|
mockServer
|
||||||
modbus
|
modbus
|
||||||
modee
|
modee
|
||||||
modetype
|
modetype
|
||||||
@@ -1344,4 +1344,9 @@ IILE
|
|||||||
Sumr
|
Sumr
|
||||||
eraseap
|
eraseap
|
||||||
roomtempoffset
|
roomtempoffset
|
||||||
dhcpc
|
dhcpc
|
||||||
|
wifioff
|
||||||
|
autonegotiation
|
||||||
|
Mbit
|
||||||
|
WROVER
|
||||||
|
OLIMEXPOEW
|
||||||
@@ -84,7 +84,7 @@ void MqttSettingsService::loop() {
|
|||||||
}
|
}
|
||||||
if (_reconfigureMqtt || (_disconnectedAt && static_cast<uint32_t>(uuid::get_uptime() - _disconnectedAt) >= MQTT_RECONNECTION_DELAY)) {
|
if (_reconfigureMqtt || (_disconnectedAt && static_cast<uint32_t>(uuid::get_uptime() - _disconnectedAt) >= MQTT_RECONNECTION_DELAY)) {
|
||||||
// configure MQTT client
|
// configure MQTT client
|
||||||
if (_reconfigureMqtt) {
|
if (_reconfigureMqtt && _state.enabled) {
|
||||||
emsesp::EMSESP::logger().info("Starting MQTT service");
|
emsesp::EMSESP::logger().info("Starting MQTT service");
|
||||||
}
|
}
|
||||||
_disconnectedAt = configureMqtt() ? 0 : uuid::get_uptime();
|
_disconnectedAt = configureMqtt() ? 0 : uuid::get_uptime();
|
||||||
@@ -130,6 +130,7 @@ MqttClient * MqttSettingsService::getMqttClient() {
|
|||||||
void MqttSettingsService::onMqttConnect(bool sessionPresent) {
|
void MqttSettingsService::onMqttConnect(bool sessionPresent) {
|
||||||
(void)sessionPresent;
|
(void)sessionPresent;
|
||||||
emsesp::EMSESP::mqtt_.on_connect();
|
emsesp::EMSESP::mqtt_.on_connect();
|
||||||
|
_disconnectReason = espMqttClientTypes::DisconnectReason::USER_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MqttSettingsService::onMqttDisconnect(espMqttClientTypes::DisconnectReason reason) {
|
void MqttSettingsService::onMqttDisconnect(espMqttClientTypes::DisconnectReason reason) {
|
||||||
@@ -158,6 +159,9 @@ bool MqttSettingsService::configureMqtt() {
|
|||||||
emsesp::EMSESP::logger().debug("Disconnecting to configure");
|
emsesp::EMSESP::logger().debug("Disconnecting to configure");
|
||||||
#endif
|
#endif
|
||||||
_mqttClient->disconnect(true);
|
_mqttClient->disconnect(true);
|
||||||
|
if (!_state.enabled) {
|
||||||
|
emsesp::EMSESP::logger().info("Stopping MQTT client");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// only connect if WiFi is connected and MQTT is enabled
|
// only connect if WiFi is connected and MQTT is enabled
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ void NetworkSettings::read(NetworkSettings & settings, JsonObject root) {
|
|||||||
root["enableCORS"] = settings.enableCORS;
|
root["enableCORS"] = settings.enableCORS;
|
||||||
root["CORSOrigin"] = settings.CORSOrigin;
|
root["CORSOrigin"] = settings.CORSOrigin;
|
||||||
root["tx_power"] = settings.tx_power;
|
root["tx_power"] = settings.tx_power;
|
||||||
|
root["eth_10mbit"] = settings.eth_10mbit;
|
||||||
|
|
||||||
// extended settings
|
// extended settings
|
||||||
JsonUtils::writeIP(root, "local_ip", settings.localIP);
|
JsonUtils::writeIP(root, "local_ip", settings.localIP);
|
||||||
@@ -51,6 +52,7 @@ StateUpdateResult NetworkSettings::update(JsonObject root, NetworkSettings & set
|
|||||||
settings.enableMDNS = root["enableMDNS"] | true;
|
settings.enableMDNS = root["enableMDNS"] | true;
|
||||||
settings.enableCORS = root["enableCORS"];
|
settings.enableCORS = root["enableCORS"];
|
||||||
settings.CORSOrigin = root["CORSOrigin"] | "*";
|
settings.CORSOrigin = root["CORSOrigin"] | "*";
|
||||||
|
settings.eth_10mbit = root["eth_10mbit"];
|
||||||
|
|
||||||
// extended settings
|
// extended settings
|
||||||
JsonUtils::readIP(root, "local_ip", settings.localIP);
|
JsonUtils::readIP(root, "local_ip", settings.localIP);
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ class NetworkSettings {
|
|||||||
bool enableMDNS = true;
|
bool enableMDNS = true;
|
||||||
bool enableCORS = false;
|
bool enableCORS = false;
|
||||||
String CORSOrigin = "*";
|
String CORSOrigin = "*";
|
||||||
|
bool eth_10mbit = false; // force 10BASE-T half-duplex, no auto-negotiation
|
||||||
|
|
||||||
// optional configuration for static IP address
|
// optional configuration for static IP address
|
||||||
IPAddress localIP;
|
IPAddress localIP;
|
||||||
|
|||||||
@@ -13,10 +13,32 @@ static String getFilenameExtension(const String & filename) {
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Accepts a raw 32-char hex digest, optionally with trailing newline or a GNU "hash filename" suffix.
|
||||||
|
static bool parseMd5Digest(const uint8_t * data, size_t len, std::array<char, 33> & out) {
|
||||||
|
size_t i = 0;
|
||||||
|
while (i < len && (data[i] == ' ' || data[i] == '\t' || data[i] == '\r' || data[i] == '\n')) {
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
if (len - i < 32) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (size_t n = 0; n < 32; n++) {
|
||||||
|
const char c = static_cast<char>(data[i + n]);
|
||||||
|
const bool hex = (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');
|
||||||
|
if (!hex) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
out[n] = (c >= 'A' && c <= 'F') ? static_cast<char>(c - 'A' + 'a') : c;
|
||||||
|
}
|
||||||
|
out[32] = '\0';
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
UploadFileService::UploadFileService(AsyncWebServer * server, SecurityManager * securityManager)
|
UploadFileService::UploadFileService(AsyncWebServer * server, SecurityManager * securityManager)
|
||||||
: _securityManager(securityManager)
|
: _securityManager(securityManager)
|
||||||
, _is_firmware(false)
|
, _is_firmware(false)
|
||||||
, _is_filesystem(false)
|
, _is_filesystem(false)
|
||||||
|
, _md5_applied(false)
|
||||||
, _md5() {
|
, _md5() {
|
||||||
server->on(
|
server->on(
|
||||||
UPLOAD_FILE_PATH,
|
UPLOAD_FILE_PATH,
|
||||||
@@ -48,18 +70,23 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri
|
|||||||
// LittleFS filesystem image
|
// LittleFS filesystem image
|
||||||
_is_filesystem = true;
|
_is_filesystem = true;
|
||||||
_md5[0] = '\0'; // clear any stale md5 so Update.end() doesn't compare against it
|
_md5[0] = '\0'; // clear any stale md5 so Update.end() doesn't compare against it
|
||||||
|
_md5_applied = false;
|
||||||
} else if ((extension == "bin") && (filesize > 1000000)) {
|
} else if ((extension == "bin") && (filesize > 1000000)) {
|
||||||
_is_firmware = true;
|
_is_firmware = true;
|
||||||
} else if (extension == "json") {
|
} else if (extension == "json") {
|
||||||
_md5[0] = '\0'; // clear md5
|
_md5[0] = '\0'; // clear md5
|
||||||
|
_md5_applied = false;
|
||||||
} else if (extension == "md5") {
|
} else if (extension == "md5") {
|
||||||
if (len == _md5.size() - 1) {
|
if (!parseMd5Digest(data, len, _md5)) {
|
||||||
std::memcpy(_md5.data(), data, _md5.size() - 1);
|
emsesp::EMSESP::logger().err("Invalid MD5 digest file");
|
||||||
_md5.back() = '\0';
|
handleError(request, 406); // Not Acceptable
|
||||||
|
} else {
|
||||||
|
emsesp::EMSESP::logger().info("MD5 digest received (%s). Now upload the firmware BIN", _md5.data());
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
_md5.front() = '\0';
|
_md5.front() = '\0';
|
||||||
|
_md5_applied = false;
|
||||||
emsesp::EMSESP::logger().err("Unsupported file type: %s, size: %u", filename.c_str(), filesize);
|
emsesp::EMSESP::logger().err("Unsupported file type: %s, size: %u", filename.c_str(), filesize);
|
||||||
handleError(request, 406); // Not Acceptable - unsupported file type
|
handleError(request, 406); // Not Acceptable - unsupported file type
|
||||||
return;
|
return;
|
||||||
@@ -103,9 +130,11 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri
|
|||||||
emsesp::EMSESP::system_.systemStatus(emsesp::SYSTEM_STATUS::SYSTEM_STATUS_UPLOADING);
|
emsesp::EMSESP::system_.systemStatus(emsesp::SYSTEM_STATUS::SYSTEM_STATUS_UPLOADING);
|
||||||
|
|
||||||
if (Update.begin(filesize - sizeof(esp_image_header_t))) {
|
if (Update.begin(filesize - sizeof(esp_image_header_t))) {
|
||||||
|
_md5_applied = false;
|
||||||
if (strlen(_md5.data()) == _md5.size() - 1) {
|
if (strlen(_md5.data()) == _md5.size() - 1) {
|
||||||
Update.setMD5(_md5.data());
|
Update.setMD5(_md5.data());
|
||||||
_md5.front() = '\0';
|
_md5_applied = true;
|
||||||
|
emsesp::EMSESP::logger().info("Firmware MD5 check enabled (%s)", _md5.data());
|
||||||
}
|
}
|
||||||
request->onDisconnect([this] { handleDisconnect(); }); // success, let's make sure we end the update if the client hangs up
|
request->onDisconnect([this] { handleDisconnect(); }); // success, let's make sure we end the update if the client hangs up
|
||||||
} else {
|
} else {
|
||||||
@@ -183,8 +212,19 @@ void UploadFileService::uploadComplete(AsyncWebServerRequest * request) {
|
|||||||
emsesp::EMSESP::nvs_.putBool(emsesp::EMSESP_NVS_BOOT_NEW_FIRMWARE, true);
|
emsesp::EMSESP::nvs_.putBool(emsesp::EMSESP_NVS_BOOT_NEW_FIRMWARE, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
AsyncWebServerResponse * response = request->beginResponse(200);
|
if (_is_firmware && _md5_applied) {
|
||||||
request->send(response);
|
emsesp::EMSESP::logger().info("Firmware MD5 matches");
|
||||||
|
auto * response = new emsesp::PsramAsyncJsonResponse(false);
|
||||||
|
JsonObject root = response->getRoot();
|
||||||
|
root["md5_ok"] = true;
|
||||||
|
response->setLength();
|
||||||
|
request->send(response);
|
||||||
|
_md5.front() = '\0';
|
||||||
|
_md5_applied = false;
|
||||||
|
} else {
|
||||||
|
AsyncWebServerResponse * response = request->beginResponse(200);
|
||||||
|
request->send(response);
|
||||||
|
}
|
||||||
emsesp::EMSESP::system_.systemStatus(
|
emsesp::EMSESP::system_.systemStatus(
|
||||||
emsesp::SYSTEM_STATUS::SYSTEM_STATUS_PENDING_RESTART); // will be handled by the main loop. We use pending for the Web's SystemMonitor
|
emsesp::SYSTEM_STATUS::SYSTEM_STATUS_PENDING_RESTART); // will be handled by the main loop. We use pending for the Web's SystemMonitor
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ class UploadFileService {
|
|||||||
SecurityManager * _securityManager;
|
SecurityManager * _securityManager;
|
||||||
bool _is_firmware;
|
bool _is_firmware;
|
||||||
bool _is_filesystem;
|
bool _is_filesystem;
|
||||||
|
bool _md5_applied; // true if an MD5 digest was applied to the current firmware upload
|
||||||
std::array<char, 33> _md5;
|
std::array<char, 33> _md5;
|
||||||
|
|
||||||
void handleUpload(AsyncWebServerRequest * request, const String & filename, size_t index, uint8_t * data, size_t len, bool final);
|
void handleUpload(AsyncWebServerRequest * request, const String & filename, size_t index, uint8_t * data, size_t len, bool final);
|
||||||
|
|||||||
+28
-29
@@ -295,36 +295,35 @@ static void setup_commands(std::shared_ptr<Commands> const & commands) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
commands->add_command(
|
commands->add_command(ShellContext::MAIN,
|
||||||
ShellContext::MAIN,
|
CommandFlags::ADMIN,
|
||||||
CommandFlags::ADMIN,
|
string_vector{F_(set), F_(board_profile)},
|
||||||
string_vector{F_(set), F_(board_profile)},
|
{F_(name_mandatory)},
|
||||||
{F_(name_mandatory)},
|
[](Shell & shell, const std::vector<std::string> & arguments) {
|
||||||
[](Shell & shell, const std::vector<std::string> & arguments) {
|
std::vector<int8_t> data; // led, dallas, rx, tx, button, phy_type, eth_power, eth_phy_addr, eth_clock_mode
|
||||||
std::vector<int8_t> data; // led, dallas, rx, tx, button, phy_type, eth_power, eth_phy_addr, eth_clock_mode
|
std::string board_profile = Helpers::toUpper(arguments.front());
|
||||||
std::string board_profile = Helpers::toUpper(arguments.front());
|
if (!EMSESP::system_.load_board_profile(data, board_profile)) {
|
||||||
if (!EMSESP::system_.load_board_profile(data, board_profile)) {
|
shell.println("Invalid board profile (S32, E32, E32V2, E32V2_2, MH-ET, NODEMCU, LOLIN, OLIMEX, OLIMEXPOE, OLIMEXPOEW, "
|
||||||
shell.println(
|
"C3MINI, S2MINI, S3MINI, S32S3, CUSTOM)");
|
||||||
"Invalid board profile (S32, E32, E32V2, E32V2_2, MH-ET, NODEMCU, LOLIN, OLIMEX, OLIMEXPOE, C3MINI, S2MINI, S3MINI, S32S3, CUSTOM)");
|
return;
|
||||||
return;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
EMSESP::webSettingsService.update([&](WebSettings & settings) {
|
EMSESP::webSettingsService.update([&](WebSettings & settings) {
|
||||||
settings.board_profile = board_profile.c_str();
|
settings.board_profile = board_profile.c_str();
|
||||||
settings.led_gpio = data[0];
|
settings.led_gpio = data[0];
|
||||||
settings.dallas_gpio = data[1];
|
settings.dallas_gpio = data[1];
|
||||||
settings.rx_gpio = data[2];
|
settings.rx_gpio = data[2];
|
||||||
settings.tx_gpio = data[3];
|
settings.tx_gpio = data[3];
|
||||||
settings.pbutton_gpio = data[4];
|
settings.pbutton_gpio = data[4];
|
||||||
settings.phy_type = data[5];
|
settings.phy_type = data[5];
|
||||||
settings.eth_power = data[6]; // can be -1
|
settings.eth_power = data[6]; // can be -1
|
||||||
settings.eth_phy_addr = data[7];
|
settings.eth_phy_addr = data[7];
|
||||||
settings.eth_clock_mode = data[8];
|
settings.eth_clock_mode = data[8];
|
||||||
return StateUpdateResult::CHANGED;
|
return StateUpdateResult::CHANGED;
|
||||||
});
|
});
|
||||||
shell.printfln("Loaded board profile %s. Restarting...", board_profile.c_str());
|
shell.printfln("Loaded board profile %s. Restarting...", board_profile.c_str());
|
||||||
EMSESP::system_.system_restart();
|
EMSESP::system_.system_restart();
|
||||||
});
|
});
|
||||||
|
|
||||||
commands->add_command(
|
commands->add_command(
|
||||||
ShellContext::MAIN,
|
ShellContext::MAIN,
|
||||||
|
|||||||
+8
-12
@@ -1740,15 +1740,16 @@ void EMSESP::start() {
|
|||||||
bool factory_settings = false;
|
bool factory_settings = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// #if defined(EMSESP_DEBUG)
|
|
||||||
// LOG_DEBUG("Listing root directory before:");
|
|
||||||
// system_.listDir("/", 3); // show the contents of the root directory
|
|
||||||
// #endif
|
|
||||||
|
|
||||||
// start NVS storage
|
// start NVS storage
|
||||||
if (!nvs_.begin("ems-esp", false, "nvs1")) { // try bigger nvs partition on 16M flash first
|
#ifndef EMSESP_STANDALONE
|
||||||
nvs_.begin("ems-esp", false, "nvs"); // fallback to small nvs
|
if (esp_partition_find(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_NVS, "nvs1")) {
|
||||||
|
nvs_.begin("ems-esp", false, "nvs1");
|
||||||
|
} else {
|
||||||
|
nvs_.begin("ems-esp", false, "nvs"); // fallback to small nvs
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
nvs_.begin("ems-esp", false, "nvs");
|
||||||
|
#endif
|
||||||
|
|
||||||
// set valid GPIOs list based on ESP32 chip/platform type
|
// set valid GPIOs list based on ESP32 chip/platform type
|
||||||
system_.set_valid_system_gpios();
|
system_.set_valid_system_gpios();
|
||||||
@@ -1759,11 +1760,6 @@ void EMSESP::start() {
|
|||||||
// loads core system services settings (mqtt, ap, ntp etc)
|
// loads core system services settings (mqtt, ap, ntp etc)
|
||||||
esp32React.begin();
|
esp32React.begin();
|
||||||
|
|
||||||
// #if defined(EMSESP_DEBUG)
|
|
||||||
// LOG_DEBUG("Listing root directory after:");
|
|
||||||
// system_.listDir("/", 3); // show the contents of the root directory
|
|
||||||
// #endif
|
|
||||||
|
|
||||||
#ifndef EMSESP_STANDALONE
|
#ifndef EMSESP_STANDALONE
|
||||||
if (factory_settings) {
|
if (factory_settings) {
|
||||||
LOG_WARNING("No settings found on filesystem. Using factory settings.");
|
LOG_WARNING("No settings found on filesystem. Using factory settings.");
|
||||||
|
|||||||
@@ -0,0 +1,152 @@
|
|||||||
|
/*
|
||||||
|
* EMS-ESP - https://github.com/emsesp/EMS-ESP
|
||||||
|
* Copyright 2020-2026 emsesp.org
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "emsesp.h"
|
||||||
|
|
||||||
|
#include "httpClient.h"
|
||||||
|
|
||||||
|
#include <WiFiClient.h>
|
||||||
|
#include <ESP_SSLClient.h>
|
||||||
|
|
||||||
|
namespace emsesp {
|
||||||
|
|
||||||
|
int HttpClient::request(std::string url, const std::string & method, const std::string & value, JsonObjectConst headers, std::string & result) {
|
||||||
|
int httpResult = 0;
|
||||||
|
const bool is_post = value.length() || Helpers::toLower(method) == "post";
|
||||||
|
const auto lower_url = Helpers::toLower(url.c_str());
|
||||||
|
|
||||||
|
const bool is_https = lower_url.starts_with("https://");
|
||||||
|
if (!is_https && !lower_url.starts_with("http://")) {
|
||||||
|
return 0; // unsupported scheme
|
||||||
|
}
|
||||||
|
|
||||||
|
WiFiClient * basic_client = new WiFiClient;
|
||||||
|
ESP_SSLClient * ssl_client = new ESP_SSLClient;
|
||||||
|
if (is_https) {
|
||||||
|
ssl_client->setInsecure();
|
||||||
|
// Notes: with root CA we should set here: ssl_client->setCACert(rootCACert);
|
||||||
|
// 1 KB RX buffer is fine for small JSON-style endpoints used by the scheduler/shunting-yard but it is NOT enough for servers that send full-size TLS records (>1 KB)
|
||||||
|
ssl_client->setBufferSizes(16384, 1024);
|
||||||
|
ssl_client->setSessionTimeout(120); // Set the timeout in seconds (>=120 seconds)
|
||||||
|
}
|
||||||
|
// WiFiClient is NetworkClient, which declares no setTimeout() of its own - calling it binds to
|
||||||
|
// Stream::setTimeout() and only affects readBytes(), leaving the socket on the core's 3s default
|
||||||
|
basic_client->setConnectionTimeout(CONNECT_TIMEOUT_MS);
|
||||||
|
ssl_client->setTimeout(5); // seconds, drives BearSSL only - unused on the plain HTTP path
|
||||||
|
ssl_client->setClient(basic_client, is_https); // enableSSL = false for plain HTTP
|
||||||
|
|
||||||
|
url.replace(0, is_https ? 8 : 7, "");
|
||||||
|
std::string host = url;
|
||||||
|
auto index = url.find_first_of('/');
|
||||||
|
if (index != std::string::npos) {
|
||||||
|
host = url.substr(0, index);
|
||||||
|
url.replace(0, index, "");
|
||||||
|
} else {
|
||||||
|
url = "/";
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint16_t port = is_https ? 443 : 80;
|
||||||
|
if (ssl_client->connect(host.c_str(), port)) {
|
||||||
|
bool content_set = false;
|
||||||
|
bool agent_set = false;
|
||||||
|
|
||||||
|
// assemble the request in one buffer. Sent as a dozen small writes it is left to Nagle to
|
||||||
|
// dribble them out an ACK at a time, which on a slow link can cost more than the read budget
|
||||||
|
std::string req = (is_post ? "POST " : "GET ") + url + " HTTP/1.1\r\nHost: " + host + "\r\n";
|
||||||
|
for (JsonPairConst p : headers) {
|
||||||
|
const auto key = Helpers::toLower(p.key().c_str());
|
||||||
|
content_set |= (key == "content-type");
|
||||||
|
agent_set |= (key == "user-agent");
|
||||||
|
req += std::string(p.key().c_str()) + ": " + p.value().as<std::string>() + "\r\n";
|
||||||
|
}
|
||||||
|
if (!agent_set) {
|
||||||
|
req += "User-Agent: EMS-ESP\r\n"; // CDNs are more likely to stall on a request without one
|
||||||
|
}
|
||||||
|
if (is_post) {
|
||||||
|
if (!content_set) {
|
||||||
|
req += "Content-Type: ";
|
||||||
|
req += value.starts_with('{') ? asyncsrv::T_application_json : asyncsrv::T_text_plain;
|
||||||
|
req += "\r\n";
|
||||||
|
}
|
||||||
|
req += "Content-Length: " + std::to_string(value.length()) + "\r\n";
|
||||||
|
}
|
||||||
|
req += "Connection: close\r\n\r\n"; // the blank line terminates the headers - without it the server never responds
|
||||||
|
|
||||||
|
ssl_client->print(req.c_str());
|
||||||
|
if (is_post && value.length()) {
|
||||||
|
ssl_client->print(value.c_str()); // sent separately so the body isn't copied into req
|
||||||
|
}
|
||||||
|
|
||||||
|
// available() drops to zero between TCP segments, so stopping at the first gap truncates
|
||||||
|
// any response that doesn't arrive in a single packet. Keep reading until the peer closes,
|
||||||
|
// the stream goes idle, or the overall budget runs out
|
||||||
|
const uint32_t started = millis();
|
||||||
|
uint32_t last_data = started;
|
||||||
|
while (millis() - started < TOTAL_TIMEOUT_MS) {
|
||||||
|
const int avail = ssl_client->available();
|
||||||
|
if (avail > 0) {
|
||||||
|
uint8_t buf[128];
|
||||||
|
const size_t want = (avail < (int)sizeof(buf)) ? (size_t)avail : sizeof(buf);
|
||||||
|
const int len = ssl_client->read(buf, want);
|
||||||
|
if (len > 0) {
|
||||||
|
result.append(reinterpret_cast<const char *>(buf), len);
|
||||||
|
last_data = millis();
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!ssl_client->connected()) {
|
||||||
|
break; // closed, with nothing left buffered
|
||||||
|
}
|
||||||
|
// the server may take a while to start replying
|
||||||
|
if (millis() - last_data > (result.empty() ? FIRST_BYTE_TIMEOUT_MS : IDLE_TIMEOUT_MS)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
delay(1);
|
||||||
|
}
|
||||||
|
ssl_client->stop();
|
||||||
|
|
||||||
|
const auto received = result.length();
|
||||||
|
|
||||||
|
// parse the status line "HTTP/1.x <code> <reason>". stoi() would abort rather than throw on
|
||||||
|
// a malformed response, since the firmware is built with -fno-exceptions
|
||||||
|
if (result.starts_with("HTTP/")) {
|
||||||
|
index = result.find_first_of(' ');
|
||||||
|
if (index != std::string::npos) {
|
||||||
|
httpResult = Helpers::atoint(result.c_str() + index + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
index = result.find("\r\n\r\n");
|
||||||
|
if (index != std::string::npos) {
|
||||||
|
result.replace(0, index + 4, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (httpResult == 0) {
|
||||||
|
// the TCP connect worked but nothing usable came back
|
||||||
|
EMSESP::logger().warning("%s no valid response from %s (%u bytes)", is_https ? "HTTPS" : "HTTP", host.c_str(), (unsigned)received);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
EMSESP::logger().warning("%s connection to %s failed", is_https ? "HTTPS" : "HTTP", host.c_str());
|
||||||
|
}
|
||||||
|
delete ssl_client;
|
||||||
|
delete basic_client;
|
||||||
|
|
||||||
|
return httpResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace emsesp
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* EMS-ESP - https://github.com/emsesp/EMS-ESP
|
||||||
|
* Copyright 2020-2026 emsesp.org
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef EMSESP_HTTPCLIENT_H
|
||||||
|
#define EMSESP_HTTPCLIENT_H
|
||||||
|
|
||||||
|
#include <ArduinoJson.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace emsesp {
|
||||||
|
|
||||||
|
class HttpClient {
|
||||||
|
public:
|
||||||
|
static int request(std::string url, const std::string & method, const std::string & value, JsonObjectConst headers, std::string & result);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static constexpr uint32_t CONNECT_TIMEOUT_MS = 5000; // TCP connect, the core defaults to 3s
|
||||||
|
static constexpr uint32_t FIRST_BYTE_TIMEOUT_MS = 8000; // how long the server may take to start replying
|
||||||
|
static constexpr uint32_t IDLE_TIMEOUT_MS = 500; // gap in the stream that marks the end of a response
|
||||||
|
static constexpr uint32_t TOTAL_TIMEOUT_MS = 10000; // ceiling for the whole read
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace emsesp
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -430,7 +430,7 @@ MAKE_TRANSLATION(pumpMode, "pumpmode", "boiler pump mode", "Kesselpumpenmodus",
|
|||||||
MAKE_TRANSLATION(pumpCharacter, "pumpcharacter", "boiler pump characteristic", "Charakteristik der Kesselpumpe", "karakteristiek ketelpomp", "pannpumpsegenskaper", "charakterystyka pompy kotłowej", "kjelepumpekarakteristikk", "caractéristique de la pompe de la chaudière", "kazan pompası karakteristiği", "caratteristica della pompa della caldaia", "charakteristika kotlového čerpadla", "charakteristika čerpadla kotle")
|
MAKE_TRANSLATION(pumpCharacter, "pumpcharacter", "boiler pump characteristic", "Charakteristik der Kesselpumpe", "karakteristiek ketelpomp", "pannpumpsegenskaper", "charakterystyka pompy kotłowej", "kjelepumpekarakteristikk", "caractéristique de la pompe de la chaudière", "kazan pompası karakteristiği", "caratteristica della pompa della caldaia", "charakteristika kotlového čerpadla", "charakteristika čerpadla kotle")
|
||||||
MAKE_TRANSLATION(pumpOnTemp, "pumpontemp", "pump logic temperature", "Pumpenlogiktemperatur", "pomplogica temperatuur", "Pumplogiktemperatur", "temperatura logiki pompy", "pumpelogikktemperatur", "température logique pompe", "pompa mantık sıcaklığı", "temperatura logica pompa", "teplota logiky čerpadla", "teplota logiky čerpadla")
|
MAKE_TRANSLATION(pumpOnTemp, "pumpontemp", "pump logic temperature", "Pumpenlogiktemperatur", "pomplogica temperatuur", "Pumplogiktemperatur", "temperatura logiki pompy", "pumpelogikktemperatur", "température logique pompe", "pompa mantık sıcaklığı", "temperatura logica pompa", "teplota logiky čerpadla", "teplota logiky čerpadla")
|
||||||
MAKE_TRANSLATION(headertemp, "headertemp", "low loss header", "Hydr. Weiche", "open verdeler", "Fördelare", "sprzęgło hydrauliczne", "lav tap header", "bouteille de déc. hydr.", "isı bloğu gidiş suyu sıc.", "comp. idr.", "nízkostratová hlavica", "hydraulický oddělovač")
|
MAKE_TRANSLATION(headertemp, "headertemp", "low loss header", "Hydr. Weiche", "open verdeler", "Fördelare", "sprzęgło hydrauliczne", "lav tap header", "bouteille de déc. hydr.", "isı bloğu gidiş suyu sıc.", "comp. idr.", "nízkostratová hlavica", "hydraulický oddělovač")
|
||||||
MAKE_TRANSLATION(heatblock, "heatblock", "heating block", "Wärmezelle", "Aanvoertemp. warmtecel", "Värmeblock", "blok grzewczy", "varmeblokk", "départ corps de chauffe", "Hid.denge kabı sıcaklığı", "mandata scamb. pr.", "vykurovací blok", "blok topení")
|
MAKE_TRANSLATION(heatblock, "heatblock", "Heatblock temperature", "Wärmeblocktemperatur", "Heatblock temperatuur", "Värmeblocktemperatur", "temperatura bloku grzewczego", "varmeblokk temperatur", "température du bloc chauffant", "ısı bloğu sıcaklığı", "temperatura blocco riscaldante", "teplota tepelného bloku", "teplota tepelného bloku")
|
||||||
MAKE_TRANSLATION(pumpKickHour, "pumpkickhour", "pump kick hour", "Stunde Pumpkick")
|
MAKE_TRANSLATION(pumpKickHour, "pumpkickhour", "pump kick hour", "Stunde Pumpkick")
|
||||||
MAKE_TRANSLATION(pumpKickDay, "pumpkickday", "pump kick day", "Tag Pumpkick")
|
MAKE_TRANSLATION(pumpKickDay, "pumpkickday", "pump kick day", "Tag Pumpkick")
|
||||||
MAKE_TRANSLATION(pumpKickDelay, "pumpkickdelay", "pump kick delay", "Pause vor Pumpkick")
|
MAKE_TRANSLATION(pumpKickDelay, "pumpkickdelay", "pump kick delay", "Pause vor Pumpkick")
|
||||||
@@ -581,7 +581,7 @@ MAKE_TRANSLATION(lowNoiseMode, "lownoisemode", "low noise mode", "Geräuscharmer
|
|||||||
MAKE_TRANSLATION(lowNoiseStart, "lownoisestart", "low noise starttime", "Start geräuscharmer Betrieb", "Start stil bedrijf", "Tyst drift starttid", "początek trybu cichego", "stille modu starttid", "heure démarrage faible bruit", "düşük ses başlangıç", "ora di avvio a basso rumore", "nízka hlučnosť spustenia", "čas začátku nízkého hluku")
|
MAKE_TRANSLATION(lowNoiseStart, "lownoisestart", "low noise starttime", "Start geräuscharmer Betrieb", "Start stil bedrijf", "Tyst drift starttid", "początek trybu cichego", "stille modu starttid", "heure démarrage faible bruit", "düşük ses başlangıç", "ora di avvio a basso rumore", "nízka hlučnosť spustenia", "čas začátku nízkého hluku")
|
||||||
MAKE_TRANSLATION(lowNoiseStop, "lownoisestop", "low noise stoptime", "Stopp geräuscharmer Betrieb", "Stop stil bedrijf", "Tyst drift stopptid", "koniec trybu cichego", "stille modus stopptid", "heure arrêt faible bruit", "düşük ses bitiş", "ora di arresto funzionamento silenzioso", "doba zastavenia s nízkou hlučnosťou", "čas konce nízkého hluku")
|
MAKE_TRANSLATION(lowNoiseStop, "lownoisestop", "low noise stoptime", "Stopp geräuscharmer Betrieb", "Stop stil bedrijf", "Tyst drift stopptid", "koniec trybu cichego", "stille modus stopptid", "heure arrêt faible bruit", "düşük ses bitiş", "ora di arresto funzionamento silenzioso", "doba zastavenia s nízkou hlučnosťou", "čas konce nízkého hluku")
|
||||||
MAKE_TRANSLATION(energyPriceGas, "energypricegas", "energy price gas", "Energiepreis Gas", "Energieprijs gas", "Gaspris", "cena energii z gazu", "energipris gass", "prix énergie gaz", "gaz enerjisi fiyatı", "prezzo energia gas", "cena energie plyn", "cena energie plyn")
|
MAKE_TRANSLATION(energyPriceGas, "energypricegas", "energy price gas", "Energiepreis Gas", "Energieprijs gas", "Gaspris", "cena energii z gazu", "energipris gass", "prix énergie gaz", "gaz enerjisi fiyatı", "prezzo energia gas", "cena energie plyn", "cena energie plyn")
|
||||||
MAKE_TRANSLATION(energyPriceEl, "energypriceel", "energy price electric", "Energiepreis Eletrizität", "energieprijs electriciteit", "Elpris", "cena energii elektrycznej", "strømpris", "prix énergie électrique", "elektrik enerjisi fiyatı", "prezzo energia elettrica", "cena elektrickej energie", "cena energie elektřina")
|
MAKE_TRANSLATION(energyPriceEl, "energypriceel", "energy price electric", "Energiepreis Elektrizität", "energieprijs electriciteit", "Elpris", "cena energii elektrycznej", "strømpris", "prix énergie électrique", "elektrik enerjisi fiyatı", "prezzo energia elettrica", "cena elektrickej energie", "cena energie elektřina")
|
||||||
MAKE_TRANSLATION(energyPricePV, "energyfeedpv", "feed in PV", "PV-Einspeisevergütung", "PV teruglevertarief", "PV Energi", "cena energii PV", "strømpris PV", "alimentation PV", "giren güneş enerjisi", "energia fotovoltaico", "Výkupná cena FV", "přetok FV")
|
MAKE_TRANSLATION(energyPricePV, "energyfeedpv", "feed in PV", "PV-Einspeisevergütung", "PV teruglevertarief", "PV Energi", "cena energii PV", "strømpris PV", "alimentation PV", "giren güneş enerjisi", "energia fotovoltaico", "Výkupná cena FV", "přetok FV")
|
||||||
MAKE_TRANSLATION(hybridDHW, "hybriddhw", "hybrid DHW", "Hybrid-Warmwasser", "Hybride ww", "Hybridläge varmvatten", "hybrydowa c.w.u.", "hybridmodus varmtvann", "ecs hybride", "hibrit SKS", "ACS ibrida", "hybridná TÚV", "hybridní TUV")
|
MAKE_TRANSLATION(hybridDHW, "hybriddhw", "hybrid DHW", "Hybrid-Warmwasser", "Hybride ww", "Hybridläge varmvatten", "hybrydowa c.w.u.", "hybridmodus varmtvann", "ecs hybride", "hibrit SKS", "ACS ibrida", "hybridná TÚV", "hybridní TUV")
|
||||||
MAKE_TRANSLATION(airPurgeMode, "airpurgemode", "air purge mode", "Luftspülung", "Luchtzuivering", "Luftreningsläge", "tryb oczyszczania powietrza", "luftsrensningsmodus", "mode purge air", "hava temizleme modu", "modalita spurgo aria", "režim čistenia vzduchu", "režim odvzdušnění")
|
MAKE_TRANSLATION(airPurgeMode, "airpurgemode", "air purge mode", "Luftspülung", "Luchtzuivering", "Luftreningsläge", "tryb oczyszczania powietrza", "luftsrensningsmodus", "mode purge air", "hava temizleme modu", "modalita spurgo aria", "režim čistenia vzduchu", "režim odvzdušnění")
|
||||||
|
|||||||
@@ -28,4 +28,7 @@ void setup() {
|
|||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
application.loop();
|
application.loop();
|
||||||
|
#ifndef EMSESP_STANDALONE
|
||||||
|
delay(1); // block for a tick so the idle task gets to run and the core can clock-gate
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
+104
-48
@@ -49,9 +49,10 @@ void Network::begin() {
|
|||||||
nosleep_ = settings.nosleep;
|
nosleep_ = settings.nosleep;
|
||||||
tx_power_ = settings.tx_power;
|
tx_power_ = settings.tx_power;
|
||||||
bssid_ = settings.bssid;
|
bssid_ = settings.bssid;
|
||||||
|
eth_10mbit_ = settings.eth_10mbit;
|
||||||
});
|
});
|
||||||
|
|
||||||
// read Ethernet settings
|
// read Ethernet hardware settings
|
||||||
EMSESP::webSettingsService.read([&](WebSettings & settings) {
|
EMSESP::webSettingsService.read([&](WebSettings & settings) {
|
||||||
phy_type_ = settings.phy_type;
|
phy_type_ = settings.phy_type;
|
||||||
eth_power_ = settings.eth_power;
|
eth_power_ = settings.eth_power;
|
||||||
@@ -78,39 +79,16 @@ void Network::begin() {
|
|||||||
|
|
||||||
phase_ = initialPhase();
|
phase_ = initialPhase();
|
||||||
|
|
||||||
// Initialise WiFi once when the Network service starts
|
startWiFiRadio();
|
||||||
WiFi.persistent(false);
|
|
||||||
WiFi.setAutoReconnect(false);
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
|
|
||||||
if (WiFi.STA.started()) {
|
#if CONFIG_IDF_TARGET_ESP32
|
||||||
WiFi.disconnect(true, true); // wipe old settings; only when STA is up
|
// Ethernet is switched off but the board still has a PHY wired up. Hold its power/oscillator
|
||||||
} else {
|
// enable low so an unused LAN8720 isn't left clocked and burning current for the whole uptime.
|
||||||
WiFi.disconnect(true, false); // disconnect/off without erase, so no warning is shown
|
if (phy_type_ == PHY_type::PHY_TYPE_NONE && eth_power_ != -1) {
|
||||||
|
pinMode(eth_power_, OUTPUT);
|
||||||
|
digitalWrite(eth_power_, LOW);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN);
|
|
||||||
WiFi.setHostname(hostname_.c_str()); // updates shared default_hostname buffer
|
|
||||||
WiFi.enableSTA(true); // creates the STA netif
|
|
||||||
WiFi.STA.setHostname(hostname_.c_str()); // pushes to esp_netif_set_hostname
|
|
||||||
WiFi.enableIPv6(true);
|
|
||||||
if (staticIPConfig_) {
|
|
||||||
WiFi.config(localIP_, gatewayIP_, subnetMask_, dnsIP1_, dnsIP2_); // configure for static IP
|
|
||||||
}
|
|
||||||
|
|
||||||
// www.esp32.com/viewtopic.php?t=12055
|
|
||||||
if (bandwidth20_) {
|
|
||||||
esp_wifi_set_bandwidth(static_cast<wifi_interface_t>(ESP_IF_WIFI_STA), WIFI_BW_HT20);
|
|
||||||
} else {
|
|
||||||
esp_wifi_set_bandwidth(static_cast<wifi_interface_t>(ESP_IF_WIFI_STA), WIFI_BW_HT40);
|
|
||||||
}
|
|
||||||
if (nosleep_) {
|
|
||||||
WiFi.setSleep(false); // turn off sleep - WIFI_PS_NONE
|
|
||||||
}
|
|
||||||
|
|
||||||
// scan settings give connect issues since arduino 2.0.14 and arduino 3.x.x with some wifi systems
|
|
||||||
// WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN); // default is FAST_SCAN
|
|
||||||
// WiFi.setSortMethod(WIFI_CONNECT_AP_BY_SIGNAL); // is default, no need to set
|
|
||||||
|
|
||||||
// avoid duplicate registration, so register the lambdas only once across the lifetime of this Network instance
|
// avoid duplicate registration, so register the lambdas only once across the lifetime of this Network instance
|
||||||
if (!wifi_events_registered_) {
|
if (!wifi_events_registered_) {
|
||||||
@@ -220,10 +198,10 @@ void Network::reconnect() {
|
|||||||
LOG_DEBUG("Reconnecting all networks");
|
LOG_DEBUG("Reconnecting all networks");
|
||||||
|
|
||||||
#ifndef EMSESP_STANDALONE
|
#ifndef EMSESP_STANDALONE
|
||||||
// disconnect WiFi
|
// Drop STA association but leave the driver running. begin() re-applies hostname
|
||||||
|
// and IPv6; tearing the radio down here races with WIFI_EVENT_STA_START (12289/259).
|
||||||
if (wifi_connected()) {
|
if (wifi_connected()) {
|
||||||
WiFi.disconnect(true, true);
|
WiFi.disconnect(false, true);
|
||||||
WiFi.mode(WIFI_STA); // reset mode
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// disconnect AP
|
// disconnect AP
|
||||||
@@ -251,9 +229,14 @@ void Network::reconnect() {
|
|||||||
// boards without an Ethernet PHY skip straight to WIFI; without a configured SSID, straight to AP
|
// boards without an Ethernet PHY skip straight to WIFI; without a configured SSID, straight to AP
|
||||||
// (unless AP provision mode is Never — then stay on WIFI and keep waiting)
|
// (unless AP provision mode is Never — then stay on WIFI and keep waiting)
|
||||||
NetPhase Network::initialPhase() const {
|
NetPhase Network::initialPhase() const {
|
||||||
if (phy_type_ != PHY_type::PHY_TYPE_NONE) {
|
#if CONFIG_IDF_TARGET_ESP32
|
||||||
|
|
||||||
|
bool eth_clock_conflicts_psram =
|
||||||
|
ESP.getPsramSize() && ((eth_clock_mode_t)eth_clock_mode_ == ETH_CLOCK_GPIO16_OUT || (eth_clock_mode_t)eth_clock_mode_ == ETH_CLOCK_GPIO17_OUT);
|
||||||
|
if (phy_type_ != PHY_type::PHY_TYPE_NONE && !eth_clock_conflicts_psram) {
|
||||||
return NetPhase::ETHERNET;
|
return NetPhase::ETHERNET;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (!ssid_.isEmpty() || ap_provisionMode_ == AP_MODE_NEVER) {
|
if (!ssid_.isEmpty() || ap_provisionMode_ == AP_MODE_NEVER) {
|
||||||
return NetPhase::WIFI;
|
return NetPhase::WIFI;
|
||||||
}
|
}
|
||||||
@@ -326,6 +309,10 @@ void Network::checkConnection() {
|
|||||||
network_iface_ = NetIface::NONE;
|
network_iface_ = NetIface::NONE;
|
||||||
if (lost_iface == NetIface::ETHERNET) {
|
if (lost_iface == NetIface::ETHERNET) {
|
||||||
LOG_WARNING("Ethernet connection lost");
|
LOG_WARNING("Ethernet connection lost");
|
||||||
|
// restore the radio now so the WiFi and AP fallbacks have something to work with
|
||||||
|
if (wifi_radio_off_) {
|
||||||
|
startWiFiRadio();
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
begin();
|
begin();
|
||||||
@@ -502,6 +489,59 @@ const char * Network::disconnectReason([[maybe_unused]] uint8_t code) {
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Bring up the STA interface and apply all the radio-level settings to it
|
||||||
|
// Safe to call repeatedly - enableSTA() is a no-op when the STA is already running, and recreates the netif after stopWiFiRadio() has torn it down
|
||||||
|
void Network::startWiFiRadio() {
|
||||||
|
#ifndef EMSESP_STANDALONE
|
||||||
|
WiFi.persistent(false); // keep credentials in RAM so we don't auto-join leftover NVS config
|
||||||
|
WiFi.setAutoReconnect(false);
|
||||||
|
WiFi.mode(WIFI_STA);
|
||||||
|
|
||||||
|
// Keep the radio up. disconnect(wifioff=true) maps to STA.end() -> esp_wifi_stop()
|
||||||
|
if (WiFi.STA.started()) {
|
||||||
|
WiFi.disconnect(false, true); // drop leftover association, wipe RAM config
|
||||||
|
}
|
||||||
|
|
||||||
|
// scan settings give connect issues since arduino 2.0.14 and arduino 3.x.x with some wifi systems
|
||||||
|
WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN); // default is FAST_SCAN
|
||||||
|
WiFi.setHostname(hostname_.c_str()); // updates shared default_hostname buffer
|
||||||
|
WiFi.enableSTA(true); // no-op if already STA; recreates netif after a full off
|
||||||
|
WiFi.STA.setHostname(hostname_.c_str()); // pushes to esp_netif_set_hostname
|
||||||
|
WiFi.enableIPv6(true);
|
||||||
|
if (staticIPConfig_) {
|
||||||
|
WiFi.config(localIP_, gatewayIP_, subnetMask_, dnsIP1_, dnsIP2_); // configure for static IP
|
||||||
|
}
|
||||||
|
|
||||||
|
// www.esp32.com/viewtopic.php?t=12055
|
||||||
|
if (bandwidth20_) {
|
||||||
|
esp_wifi_set_bandwidth(static_cast<wifi_interface_t>(ESP_IF_WIFI_STA), WIFI_BW_HT20);
|
||||||
|
} else {
|
||||||
|
esp_wifi_set_bandwidth(static_cast<wifi_interface_t>(ESP_IF_WIFI_STA), WIFI_BW_HT40);
|
||||||
|
}
|
||||||
|
if (nosleep_) {
|
||||||
|
WiFi.setSleep(false); // turn off sleep - WIFI_PS_NONE
|
||||||
|
} else {
|
||||||
|
WiFi.setSleep(true); // WIFI_PS_MIN_MODEM
|
||||||
|
}
|
||||||
|
|
||||||
|
wifi_radio_off_ = false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Power down the WiFi radio completely (esp_wifi_stop), used when Ethernet is carrying the traffic.
|
||||||
|
// An idle STA still keeps the receiver powered. It also unloads the driver's DMA buffer pool of around 20KB
|
||||||
|
void Network::stopWiFiRadio() {
|
||||||
|
#ifndef EMSESP_STANDALONE
|
||||||
|
if (wifi_radio_off_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
WiFi.mode(WIFI_OFF);
|
||||||
|
wifi_radio_off_ = true;
|
||||||
|
wifi_connect_pending_ = false;
|
||||||
|
LOG_DEBUG("Powering down WiFi radio, Ethernet is active");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
// WiFi management
|
// WiFi management
|
||||||
void Network::startWIFI() {
|
void Network::startWIFI() {
|
||||||
#ifndef EMSESP_STANDALONE
|
#ifndef EMSESP_STANDALONE
|
||||||
@@ -510,6 +550,11 @@ void Network::startWIFI() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the radio was powered down while Ethernet was up, so bring it back before trying to associate
|
||||||
|
if (wifi_radio_off_) {
|
||||||
|
startWiFiRadio();
|
||||||
|
}
|
||||||
|
|
||||||
// exit if WiFi or Ethernet is already connected, or if we have no SSID or another Wifi.begin() is already in progress
|
// exit if WiFi or Ethernet is already connected, or if we have no SSID or another Wifi.begin() is already in progress
|
||||||
if (WiFi.isConnected() || ssid_.isEmpty() || ethernet_connected() || wifi_connect_pending_) {
|
if (WiFi.isConnected() || ssid_.isEmpty() || ethernet_connected() || wifi_connect_pending_) {
|
||||||
return;
|
return;
|
||||||
@@ -529,14 +574,7 @@ void Network::startWIFI() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if CONFIG_IDF_TARGET_ESP32 && !defined(EMSESP_STANDALONE)
|
#if CONFIG_IDF_TARGET_ESP32 && !defined(EMSESP_STANDALONE)
|
||||||
// Unlike WiFi, which stamps the hostname onto the STA netif as it is created, the Arduino ETH class
|
|
||||||
// leaves it unset, so lwIP falls back to CONFIG_LWIP_LOCAL_HOSTNAME ("tasmota" in the SDK we build
|
|
||||||
// against). esp_eth_start() polls the PHY synchronously, so on a warm reboot where the link never
|
|
||||||
// dropped the DHCP DISCOVER can go out before ETH.begin() has even returned. This handler is
|
|
||||||
// registered ahead of the esp_netif glue and therefore runs first, applying the hostname before the
|
|
||||||
// netif is handed to lwIP.
|
|
||||||
static char eth_hostname[33] = {0};
|
static char eth_hostname[33] = {0};
|
||||||
|
|
||||||
static void ethApplyHostname(void * /*arg*/, esp_event_base_t /*base*/, int32_t /*event_id*/, void * /*event_data*/) {
|
static void ethApplyHostname(void * /*arg*/, esp_event_base_t /*base*/, int32_t /*event_id*/, void * /*event_data*/) {
|
||||||
if (eth_hostname[0] != '\0' && ETH.netif() != nullptr) {
|
if (eth_hostname[0] != '\0' && ETH.netif() != nullptr) {
|
||||||
esp_netif_set_hostname(ETH.netif(), eth_hostname);
|
esp_netif_set_hostname(ETH.netif(), eth_hostname);
|
||||||
@@ -555,11 +593,7 @@ void Network::startEthernet() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The driver is installed once and then left alone. Re-running the bring-up on a live interface
|
// Ensure the Ethernet driver is installed once and then left alone
|
||||||
// tears it down behind our back: pinMode() on the PHY power pin hands the pin from the Ethernet
|
|
||||||
// bus back to GPIO, which fires the peripheral manager's deinit callback and calls ETH.end(),
|
|
||||||
// destroying the netif, its event group and the event handlers from the main loop task while the
|
|
||||||
// arduino_events task may be dispatching a link-up on the other core.
|
|
||||||
if (ethernet_started_ || ethernet_connect_pending_ || ethernet_connected()) {
|
if (ethernet_started_ || ethernet_connect_pending_ || ethernet_connected()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -571,6 +605,11 @@ void Network::startEthernet() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ESP.getPsramSize() && ((eth_clock_mode_t)eth_clock_mode_ == ETH_CLOCK_GPIO16_OUT || (eth_clock_mode_t)eth_clock_mode_ == ETH_CLOCK_GPIO17_OUT)) {
|
||||||
|
LOG_ERROR("Ethernet clock mode %d (GPIO16/17) conflicts with PSRAM - disabling Ethernet", eth_clock_mode_);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// The Tasmota SDK is built with CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=2, so the Ethernet MAC is derived as
|
// The Tasmota SDK is built with CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=2, so the Ethernet MAC is derived as
|
||||||
// a locally-administered address from base+1 instead of the universal base+3 that Arduino Core 2 used.
|
// a locally-administered address from base+1 instead of the universal base+3 that Arduino Core 2 used.
|
||||||
@@ -610,6 +649,13 @@ void Network::startEthernet() {
|
|||||||
eth_hostname_handler_registered_ = true;
|
eth_hostname_handler_registered_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Forcing 10BASE-T roughly halves the PHY's power draw
|
||||||
|
if (eth_10mbit_) {
|
||||||
|
ETH.setAutoNegotiation(false);
|
||||||
|
ETH.setLinkSpeed(10);
|
||||||
|
ETH.setFullDuplex(false);
|
||||||
|
}
|
||||||
|
|
||||||
if (ETH.begin(type, eth_phy_addr_, 23, 18, eth_power_, (eth_clock_mode_t)eth_clock_mode_)) {
|
if (ETH.begin(type, eth_phy_addr_, 23, 18, eth_power_, (eth_clock_mode_t)eth_clock_mode_)) {
|
||||||
// LOG_DEBUG("Ethernet module found - initialising");
|
// LOG_DEBUG("Ethernet module found - initialising");
|
||||||
ethernet_started_ = true;
|
ethernet_started_ = true;
|
||||||
@@ -739,6 +785,11 @@ void Network::findNetworks() {
|
|||||||
stopAP();
|
stopAP();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ethernet is carrying the traffic so the STA is dead weight - shut the radio down.
|
||||||
|
if (network_iface_ == NetIface::ETHERNET) {
|
||||||
|
stopWiFiRadio();
|
||||||
|
}
|
||||||
|
|
||||||
// count the number of restarts (for Wifi and Eth)
|
// count the number of restarts (for Wifi and Eth)
|
||||||
if (juststopped_) {
|
if (juststopped_) {
|
||||||
juststopped_ = false;
|
juststopped_ = false;
|
||||||
@@ -823,6 +874,11 @@ void Network::startAP() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the AP needs the radio, which may have been powered down while Ethernet was up
|
||||||
|
if (wifi_radio_off_) {
|
||||||
|
startWiFiRadio();
|
||||||
|
}
|
||||||
|
|
||||||
if (!WiFi.softAPConfig(ap_localIP_, ap_gatewayIP_, ap_subnetMask_)) {
|
if (!WiFi.softAPConfig(ap_localIP_, ap_gatewayIP_, ap_subnetMask_)) {
|
||||||
LOG_DEBUG("softAPConfig failed");
|
LOG_DEBUG("softAPConfig failed");
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -186,6 +186,8 @@ class Network {
|
|||||||
void startAP();
|
void startAP();
|
||||||
void startWIFI();
|
void startWIFI();
|
||||||
void startEthernet();
|
void startEthernet();
|
||||||
|
void startWiFiRadio();
|
||||||
|
void stopWiFiRadio();
|
||||||
void setWiFiPower(uint8_t tx_power);
|
void setWiFiPower(uint8_t tx_power);
|
||||||
const char * disconnectReason(uint8_t code);
|
const char * disconnectReason(uint8_t code);
|
||||||
void stopAP();
|
void stopAP();
|
||||||
@@ -216,6 +218,7 @@ class Network {
|
|||||||
bool ethernet_started_ = false; // ETH.begin() succeeded; the driver runs for the lifetime of the boot
|
bool ethernet_started_ = false; // ETH.begin() succeeded; the driver runs for the lifetime of the boot
|
||||||
bool wifi_ever_connected_ = false; // set true once we've successfully obtained an IP
|
bool wifi_ever_connected_ = false; // set true once we've successfully obtained an IP
|
||||||
bool ethernet_ever_connected_ = false; // set true once we've successfully obtained an IP
|
bool ethernet_ever_connected_ = false; // set true once we've successfully obtained an IP
|
||||||
|
bool wifi_radio_off_ = false; // STA powered down because Ethernet is carrying the traffic
|
||||||
|
|
||||||
// Network and AP settings
|
// Network and AP settings
|
||||||
bool enableMDNS_;
|
bool enableMDNS_;
|
||||||
@@ -236,6 +239,7 @@ class Network {
|
|||||||
int8_t eth_power_;
|
int8_t eth_power_;
|
||||||
uint8_t eth_phy_addr_;
|
uint8_t eth_phy_addr_;
|
||||||
uint8_t eth_clock_mode_;
|
uint8_t eth_clock_mode_;
|
||||||
|
bool eth_10mbit_;
|
||||||
|
|
||||||
// AP settings
|
// AP settings
|
||||||
uint8_t ap_provisionMode_;
|
uint8_t ap_provisionMode_;
|
||||||
|
|||||||
+28
-106
@@ -22,8 +22,7 @@
|
|||||||
|
|
||||||
#include "shuntingYard.h"
|
#include "shuntingYard.h"
|
||||||
|
|
||||||
#include <WiFiClient.h>
|
#include "httpClient.h"
|
||||||
#include <ESP_SSLClient.h>
|
|
||||||
|
|
||||||
namespace emsesp {
|
namespace emsesp {
|
||||||
|
|
||||||
@@ -336,7 +335,6 @@ bool isnum(const std::string & s) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// replace commands like "<device>/<hc>/<cmd>" with its value"
|
// replace commands like "<device>/<hc>/<cmd>" with its value"
|
||||||
std::string commands(std::string & expr, bool quotes) {
|
std::string commands(std::string & expr, bool quotes) {
|
||||||
auto expr_new = Helpers::toLower(expr);
|
auto expr_new = Helpers::toLower(expr);
|
||||||
@@ -481,14 +479,14 @@ std::string calculate(const std::string & expr) {
|
|||||||
const auto rhs = stack.back();
|
const auto rhs = stack.back();
|
||||||
stack.pop_back();
|
stack.pop_back();
|
||||||
if (token.str[0] == '!') {
|
if (token.str[0] == '!') {
|
||||||
if (to_logic(rhs) < 0) {
|
const auto logic = to_logic(rhs);
|
||||||
}
|
if (logic >= 0) {
|
||||||
if (to_logic(rhs) >= 0) {
|
stack.push_back(logic == 0 ? "1" : "0");
|
||||||
stack.push_back(to_logic(rhs) == 0 ? "1" : "0");
|
|
||||||
} else if (isnum(rhs)) {
|
} else if (isnum(rhs)) {
|
||||||
stack.push_back(std::stod(rhs) == 0 ? "1" : "0");
|
stack.push_back(std::stod(rhs) == 0 ? "1" : "0");
|
||||||
} else {
|
} else {
|
||||||
EMSESP::logger().warning("missing operator");
|
// usually literal text that was left unquoted, so its '!' got read as a logical NOT
|
||||||
|
EMSESP::logger().warning("'!' needs a boolean or numeric operand, got '%s'. Literal text must be quoted", rhs.c_str());
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -691,98 +689,22 @@ std::string calculate(const std::string & expr) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// perform an HTTP/HTTPS request; returns the HTTP status code (0 on failure or unsupported scheme)
|
// find the next occurrence of c at or after `from` that is not inside a quoted string, so that
|
||||||
// the response headers are always stripped, so `result` contains only the body
|
// literal text like "too hot?" is not mistaken for a ternary. Always scans from the start of the
|
||||||
int http_request(std::string url, const std::string & method, const std::string & value, JsonObjectConst headers, std::string & result) {
|
// string because the quote state at `from` depends on everything before it.
|
||||||
int httpResult = 0;
|
static size_t find_unquoted(const std::string & s, char c, size_t from = 0) {
|
||||||
const bool is_post = value.length() || Helpers::toLower(method) == "post";
|
bool in_single = false;
|
||||||
const auto lower_url = Helpers::toLower(url.c_str());
|
bool in_double = false;
|
||||||
|
for (size_t i = 0; i < s.length(); i++) {
|
||||||
const bool is_https = lower_url.starts_with("https://");
|
if (!in_single && s[i] == '"') {
|
||||||
if (!is_https && !lower_url.starts_with("http://")) {
|
in_double = !in_double;
|
||||||
return 0; // unsupported scheme
|
} else if (!in_double && s[i] == '\'') {
|
||||||
|
in_single = !in_single;
|
||||||
|
} else if (!in_single && !in_double && s[i] == c && i >= from) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return std::string::npos;
|
||||||
WiFiClient * basic_client = new WiFiClient;
|
|
||||||
ESP_SSLClient * ssl_client = new ESP_SSLClient;
|
|
||||||
if (is_https) {
|
|
||||||
ssl_client->setInsecure(); // with root CA we should set here: ssl_client->setCACert(rootCACert);
|
|
||||||
// NOTE: 1 KB RX buffer is fine for small JSON-style endpoints used by the scheduler/shunting-yard,
|
|
||||||
// but it is NOT enough for servers that send full-size TLS records (>1 KB), e.g. GitHub release
|
|
||||||
// assets / large CDN responses. Such servers do not negotiate max_fragment_length, so the body
|
|
||||||
// can't be decoded and reads return 0. If this path is ever used to fetch large or CDN-hosted
|
|
||||||
// payloads, bump the RX buffer to 16384 (see uploadFirmwareURL in core/system.cpp for reference).
|
|
||||||
ssl_client->setBufferSizes(16384, 1024);
|
|
||||||
ssl_client->setSessionTimeout(120); // Set the timeout in seconds (>=120 seconds)
|
|
||||||
}
|
|
||||||
basic_client->setTimeout(5000); // socket-level read timeout
|
|
||||||
ssl_client->setTimeout(5); // Stream::readBytes timeout used by Update
|
|
||||||
ssl_client->setClient(basic_client, is_https); // enableSSL = false for plain HTTP
|
|
||||||
|
|
||||||
url.replace(0, is_https ? 8 : 7, "");
|
|
||||||
std::string host = url;
|
|
||||||
auto index = url.find_first_of('/');
|
|
||||||
if (index != std::string::npos) {
|
|
||||||
host = url.substr(0, index);
|
|
||||||
url.replace(0, index, "");
|
|
||||||
} else {
|
|
||||||
url = "/";
|
|
||||||
}
|
|
||||||
|
|
||||||
const uint16_t port = is_https ? 443 : 80;
|
|
||||||
if (ssl_client->connect(host.c_str(), port)) {
|
|
||||||
bool content_set = false;
|
|
||||||
ssl_client->print(is_post ? "POST " : "GET ");
|
|
||||||
ssl_client->print(url.c_str());
|
|
||||||
ssl_client->println(" HTTP/1.1");
|
|
||||||
ssl_client->print("Host: ");
|
|
||||||
ssl_client->println(host.c_str());
|
|
||||||
for (JsonPairConst p : headers) {
|
|
||||||
content_set |= (Helpers::toLower(p.key().c_str()) == "content-type");
|
|
||||||
ssl_client->print(p.key().c_str());
|
|
||||||
ssl_client->print(": ");
|
|
||||||
ssl_client->println(p.value().as<std::string>().c_str());
|
|
||||||
}
|
|
||||||
if (is_post) {
|
|
||||||
if (!content_set) {
|
|
||||||
ssl_client->print("Content-Type: ");
|
|
||||||
ssl_client->println(value.starts_with('{') ? asyncsrv::T_application_json : asyncsrv::T_text_plain);
|
|
||||||
}
|
|
||||||
ssl_client->print("Content-Length: ");
|
|
||||||
ssl_client->println(value.length());
|
|
||||||
ssl_client->println("Connection: close");
|
|
||||||
ssl_client->print("\r\n");
|
|
||||||
ssl_client->print(value.c_str());
|
|
||||||
} else {
|
|
||||||
ssl_client->println("Connection: close");
|
|
||||||
ssl_client->print("\r\n"); // terminate headers - without this the server never responds
|
|
||||||
}
|
|
||||||
|
|
||||||
auto ms = millis();
|
|
||||||
while (ssl_client->connected() && !ssl_client->available() && millis() - ms < 3000) {
|
|
||||||
delay(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (ssl_client->available()) {
|
|
||||||
result += (char)ssl_client->read();
|
|
||||||
}
|
|
||||||
ssl_client->stop();
|
|
||||||
|
|
||||||
index = result.find_first_of(' ');
|
|
||||||
if (index != std::string::npos) {
|
|
||||||
httpResult = stoi(result.substr(index + 1, 3));
|
|
||||||
}
|
|
||||||
index = result.find("\r\n\r\n");
|
|
||||||
if (index != std::string::npos) {
|
|
||||||
result.replace(0, index + 4, "");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
EMSESP::logger().warning("%s connection failed", is_https ? "HTTPS" : "HTTP");
|
|
||||||
}
|
|
||||||
delete ssl_client;
|
|
||||||
delete basic_client;
|
|
||||||
|
|
||||||
return httpResult;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// check for multiple instances of <cond> ? <expr1> : <expr2>
|
// check for multiple instances of <cond> ? <expr1> : <expr2>
|
||||||
@@ -829,7 +751,7 @@ std::string compute(const std::string & expr) {
|
|||||||
std::string method = doc[method_s] | "GET";
|
std::string method = doc[method_s] | "GET";
|
||||||
std::string result;
|
std::string result;
|
||||||
|
|
||||||
int httpResult = http_request(url, method, value, doc[header_s].as<JsonObjectConst>(), result);
|
int httpResult = HttpClient::request(url, method, value, doc[header_s].as<JsonObjectConst>(), result);
|
||||||
if (httpResult == 200) {
|
if (httpResult == 200) {
|
||||||
std::string key = doc[key_s] | "";
|
std::string key = doc[key_s] | "";
|
||||||
JsonDocument keys_doc; // JsonDocument to hold "keys" after doc is parsed with HTTP body
|
JsonDocument keys_doc; // JsonDocument to hold "keys" after doc is parsed with HTTP body
|
||||||
@@ -868,14 +790,14 @@ std::string compute(const std::string & expr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// positions: q-questionmark, c-colon
|
// positions: q-questionmark, c-colon
|
||||||
auto q = expr_new.find_first_of('?');
|
auto q = find_unquoted(expr_new, '?');
|
||||||
while (q != std::string::npos) {
|
while (q != std::string::npos) {
|
||||||
// find corresponding colon
|
// find corresponding colon
|
||||||
auto c1 = expr_new.find_first_of(':', q + 1);
|
auto c1 = find_unquoted(expr_new, ':', q + 1);
|
||||||
auto q1 = expr_new.find_first_of('?', q + 1);
|
auto q1 = find_unquoted(expr_new, '?', q + 1);
|
||||||
while (q1 < c1 && q1 != std::string::npos && c1 != std::string::npos) {
|
while (q1 < c1 && q1 != std::string::npos && c1 != std::string::npos) {
|
||||||
q1 = expr_new.find_first_of('?', q1 + 1);
|
q1 = find_unquoted(expr_new, '?', q1 + 1);
|
||||||
c1 = expr_new.find_first_of(':', c1 + 1);
|
c1 = find_unquoted(expr_new, ':', c1 + 1);
|
||||||
}
|
}
|
||||||
if (c1 == std::string::npos) {
|
if (c1 == std::string::npos) {
|
||||||
return ""; // error: missing colon
|
return ""; // error: missing colon
|
||||||
@@ -906,7 +828,7 @@ std::string compute(const std::string & expr) {
|
|||||||
} else {
|
} else {
|
||||||
return ""; // error
|
return ""; // error
|
||||||
}
|
}
|
||||||
q = expr_new.find_first_of('?'); // search next instance
|
q = find_unquoted(expr_new, '?'); // search next instance
|
||||||
}
|
}
|
||||||
|
|
||||||
return calculate(expr_new);
|
return calculate(expr_new);
|
||||||
|
|||||||
@@ -84,8 +84,6 @@ std::string calculate(const std::string & expr);
|
|||||||
// check for multiple instances of <cond> ? <expr1> : <expr2>
|
// check for multiple instances of <cond> ? <expr1> : <expr2>
|
||||||
std::string compute(const std::string & expr);
|
std::string compute(const std::string & expr);
|
||||||
|
|
||||||
int http_request(std::string url, const std::string & method, const std::string & value, JsonObjectConst headers, std::string & result);
|
} // namespace emsesp
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} // namespace emsesp
|
|
||||||
+87
-76
@@ -40,9 +40,6 @@
|
|||||||
|
|
||||||
#ifndef EMSESP_STANDALONE
|
#ifndef EMSESP_STANDALONE
|
||||||
#define ENABLE_SMTP
|
#define ENABLE_SMTP
|
||||||
#define USE_ESP_SSLCLIENT
|
|
||||||
#define READYCLIENT_SSL_CLIENT ESP_SSLClient
|
|
||||||
#define READYCLIENT_TYPE_1 // TYPE 1 when using ESP_SSLClient
|
|
||||||
#include <ESP_SSLClient.h>
|
#include <ESP_SSLClient.h>
|
||||||
#include <ReadyMail.h>
|
#include <ReadyMail.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -94,6 +91,13 @@ std::vector<uint8_t, AllocatorPSRAM<uint8_t>> System::valid_
|
|||||||
std::vector<System::GpioUsage, AllocatorPSRAM<System::GpioUsage>> System::used_gpios_;
|
std::vector<System::GpioUsage, AllocatorPSRAM<System::GpioUsage>> System::used_gpios_;
|
||||||
|
|
||||||
#ifndef EMSESP_STANDALONE
|
#ifndef EMSESP_STANDALONE
|
||||||
|
// TLSHandshakeCallback is a C function pointer, so STARTTLS needs a process-wide client slot.
|
||||||
|
static ESP_SSLClient * sendmail_ssl_client = nullptr;
|
||||||
|
|
||||||
|
static void sendmail_tls_handshake(bool & success) {
|
||||||
|
success = sendmail_ssl_client != nullptr && sendmail_ssl_client->connectSSL();
|
||||||
|
}
|
||||||
|
|
||||||
// The DNS slots are shared between IPv4 and IPv6, so with IPv6 enabled the first slot can hold an
|
// The DNS slots are shared between IPv4 and IPv6, so with IPv6 enabled the first slot can hold an
|
||||||
// IPv6 server. Pick the first IPv4 one so it matches the label we print it under.
|
// IPv6 server. Pick the first IPv4 one so it matches the label we print it under.
|
||||||
static IPAddress dns_ipv4(const NetworkInterface & netif) {
|
static IPAddress dns_ipv4(const NetworkInterface & netif) {
|
||||||
@@ -147,61 +151,88 @@ bool System::command_sendmail(const char * value, const int8_t) {
|
|||||||
port,
|
port,
|
||||||
security == EMAIL_SECURITY::SSL ? " (SSL)"
|
security == EMAIL_SECURITY::SSL ? " (SSL)"
|
||||||
: security == EMAIL_SECURITY::STARTTLS ? " (STARTTLS)"
|
: security == EMAIL_SECURITY::STARTTLS ? " (STARTTLS)"
|
||||||
: "",
|
: " (plain)",
|
||||||
value);
|
value);
|
||||||
|
|
||||||
bool success = false;
|
// Resolve the message before opening the SMTP session: compute() can do entity lookups and a
|
||||||
|
// blocking {url} fetch, which would otherwise leave the connection idle long enough to time out.
|
||||||
#ifndef EMSESP_STANDALONE
|
// The value is either a plain body or a JSON envelope overriding the configured subject/to/from.
|
||||||
auto * basic_client = new WiFiClient;
|
|
||||||
auto * ssl_client = new ESP_SSLClient;
|
|
||||||
auto * r_client = new ReadyClient(*ssl_client);
|
|
||||||
auto * smtp = new SMTPClient(*r_client);
|
|
||||||
|
|
||||||
ssl_client->setClient(basic_client);
|
|
||||||
ssl_client->setInsecure();
|
|
||||||
ssl_client->setBufferSizes(16384, 1024);
|
|
||||||
basic_client->setTimeout(5000); // socket-level read timeout
|
|
||||||
ssl_client->setTimeout(5); // Stream::readBytes timeout used by Update
|
|
||||||
r_client->addPort(port,
|
|
||||||
security == EMAIL_SECURITY::NONE ? readymail_protocol_plain_text
|
|
||||||
: security == EMAIL_SECURITY::SSL ? readymail_protocol_ssl
|
|
||||||
: readymail_protocol_tls);
|
|
||||||
|
|
||||||
|
|
||||||
// smtp->connect(server, port, sendmailCallback);
|
|
||||||
smtp->connect(server, port);
|
|
||||||
if (!smtp->isConnected()) {
|
|
||||||
LOG_ERROR("send email connection error");
|
|
||||||
delete smtp;
|
|
||||||
delete r_client;
|
|
||||||
delete ssl_client;
|
|
||||||
delete basic_client;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// LOG_INFO("authenticate %s:%s", login.c_str(), pass.c_str());
|
|
||||||
smtp->authenticate(login, pass, readymail_auth_password);
|
|
||||||
if (!smtp->isAuthenticated()) {
|
|
||||||
LOG_ERROR("send email authentication error");
|
|
||||||
delete smtp;
|
|
||||||
delete r_client;
|
|
||||||
delete ssl_client;
|
|
||||||
delete basic_client;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
JsonDocument doc(PSRAM_DOC);
|
JsonDocument doc(PSRAM_DOC);
|
||||||
String body = value;
|
String body = value;
|
||||||
if (body.length()) {
|
if (body.length()) {
|
||||||
auto error = deserializeJson(doc, (const char *)value);
|
auto error = deserializeJson(doc, (const char *)value);
|
||||||
if (!error && doc.as<JsonObject>().size() >= 0) {
|
if (!error && doc.is<JsonObject>()) {
|
||||||
subject = doc["subject"] | subject;
|
subject = doc["subject"] | subject;
|
||||||
recp = doc["to"] | recp;
|
recp = doc["to"] | recp;
|
||||||
sender = doc["from"] | sender;
|
sender = doc["from"] | sender;
|
||||||
body = doc["body"] | body;
|
body = doc["body"] | body;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// keep the original body if the calculator returns nothing, so unquoted literal text still gets sent
|
||||||
|
std::string computed_body = compute(body.c_str());
|
||||||
|
if (!computed_body.empty()) {
|
||||||
|
body = computed_body.c_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool success = false;
|
||||||
|
|
||||||
|
#ifndef EMSESP_STANDALONE
|
||||||
|
// Do not use ReadyClient: after the 220 greeting it calls connectSSL() whenever
|
||||||
|
// STARTTLS is off, so Security=Off still sends a TLS Client Hello on port 25.
|
||||||
|
auto * basic_client = new WiFiClient;
|
||||||
|
ESP_SSLClient * ssl_client = nullptr;
|
||||||
|
SMTPClient * smtp = nullptr;
|
||||||
|
|
||||||
|
basic_client->setTimeout(5000);
|
||||||
|
|
||||||
|
const bool implicit_ssl = (security == EMAIL_SECURITY::SSL);
|
||||||
|
const bool start_tls = (security == EMAIL_SECURITY::STARTTLS);
|
||||||
|
const bool tls_enabled = (security != EMAIL_SECURITY::NONE);
|
||||||
|
|
||||||
|
if (security == EMAIL_SECURITY::NONE) {
|
||||||
|
smtp = new SMTPClient(*basic_client);
|
||||||
|
} else {
|
||||||
|
ssl_client = new ESP_SSLClient;
|
||||||
|
ssl_client->setInsecure();
|
||||||
|
ssl_client->setBufferSizes(16384, 1024);
|
||||||
|
ssl_client->setTimeout(5);
|
||||||
|
// enableSSL is baked in at setClient() — true only for implicit SSL (port 465)
|
||||||
|
ssl_client->setClient(basic_client, implicit_ssl);
|
||||||
|
if (start_tls) {
|
||||||
|
sendmail_ssl_client = ssl_client;
|
||||||
|
smtp = new SMTPClient(*ssl_client, sendmail_tls_handshake, true);
|
||||||
|
} else {
|
||||||
|
smtp = new SMTPClient(*ssl_client);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto cleanup = [&]() {
|
||||||
|
delete smtp;
|
||||||
|
sendmail_ssl_client = nullptr;
|
||||||
|
delete ssl_client;
|
||||||
|
delete basic_client;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!smtp->connect(server, port, String(""), static_cast<SMTPResponseCallback>(nullptr), tls_enabled)) {
|
||||||
|
LOG_ERROR("send email connection error: %s", smtp->status().text.c_str());
|
||||||
|
cleanup();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!smtp->isConnected()) {
|
||||||
|
LOG_ERROR("send email connection error: %s", smtp->status().text.c_str());
|
||||||
|
cleanup();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// internal/open relays often have no AUTH; empty login means skip it
|
||||||
|
if (!login.isEmpty()) {
|
||||||
|
smtp->authenticate(login, pass, readymail_auth_password);
|
||||||
|
if (!smtp->isAuthenticated()) {
|
||||||
|
LOG_ERROR("send email authentication error: %s", smtp->status().text.c_str());
|
||||||
|
cleanup();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
SMTPMessage & msg = smtp->getMessage();
|
SMTPMessage & msg = smtp->getMessage();
|
||||||
msg.headers.add(rfc822_subject, subject);
|
msg.headers.add(rfc822_subject, subject);
|
||||||
msg.headers.add(rfc822_from, sender);
|
msg.headers.add(rfc822_from, sender);
|
||||||
@@ -211,12 +242,6 @@ bool System::command_sendmail(const char * value, const int8_t) {
|
|||||||
// msg.headers.addCustom("Importance", PRIORITY);
|
// msg.headers.addCustom("Importance", PRIORITY);
|
||||||
// msg.headers.addCustom("X-MSMail-Priority", PRIORITY);
|
// msg.headers.addCustom("X-MSMail-Priority", PRIORITY);
|
||||||
// msg.headers.addCustom("X-Priority", PRIORITY_NUM);
|
// msg.headers.addCustom("X-Priority", PRIORITY_NUM);
|
||||||
// run the body through the Shunting Yard calculator (entity substitution, expressions, optional {url} fetch)
|
|
||||||
// keep the original body if the calculator returns nothing
|
|
||||||
std::string computed_body = compute(body.c_str());
|
|
||||||
if (!computed_body.empty()) {
|
|
||||||
body = computed_body.c_str();
|
|
||||||
}
|
|
||||||
msg.text.body(body);
|
msg.text.body(body);
|
||||||
|
|
||||||
// bodyText.replace("\r\n", "<br>\r\n");
|
// bodyText.replace("\r\n", "<br>\r\n");
|
||||||
@@ -230,11 +255,11 @@ bool System::command_sendmail(const char * value, const int8_t) {
|
|||||||
msg.timestamp = time(nullptr);
|
msg.timestamp = time(nullptr);
|
||||||
|
|
||||||
success = smtp->send(msg);
|
success = smtp->send(msg);
|
||||||
|
if (!success) {
|
||||||
|
LOG_ERROR("send email failed: %s", smtp->status().text.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
delete smtp;
|
cleanup();
|
||||||
delete r_client;
|
|
||||||
delete ssl_client;
|
|
||||||
delete basic_client;
|
|
||||||
#endif
|
#endif
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
@@ -842,7 +867,7 @@ bool System::loop() {
|
|||||||
void System::send_info_mqtt() {
|
void System::send_info_mqtt() {
|
||||||
static uint8_t _connection = 0;
|
static uint8_t _connection = 0;
|
||||||
uint8_t connection = (EMSESP::network_.ethernet_connected() ? 1 : 0) + (EMSESP::network_.wifi_connected() ? 2 : 0) + (ntp_connected_ ? 4 : 0)
|
uint8_t connection = (EMSESP::network_.ethernet_connected() ? 1 : 0) + (EMSESP::network_.wifi_connected() ? 2 : 0) + (ntp_connected_ ? 4 : 0)
|
||||||
+ (EMSESP::network_.has_ipv6() ? 8 : 0);
|
+ (EMSESP::network_.has_ipv6() ? 8 : 0);
|
||||||
// check if connection status has changed
|
// check if connection status has changed
|
||||||
if (!Mqtt::connected() || connection == _connection) {
|
if (!Mqtt::connected() || connection == _connection) {
|
||||||
return;
|
return;
|
||||||
@@ -1067,6 +1092,7 @@ void System::show_system(uuid::console::Shell & shell) {
|
|||||||
shell.println();
|
shell.println();
|
||||||
shell.println("System:");
|
shell.println("System:");
|
||||||
shell.printfln(" Version: %s", EMSESP_APP_VERSION);
|
shell.printfln(" Version: %s", EMSESP_APP_VERSION);
|
||||||
|
shell.printfln(" System name: %s", system_name_.c_str());
|
||||||
#ifndef EMSESP_STANDALONE
|
#ifndef EMSESP_STANDALONE
|
||||||
shell.printfln(" Platform: %s (%s)", EMSESP_PLATFORM, ESP.getChipModel());
|
shell.printfln(" Platform: %s (%s)", EMSESP_PLATFORM, ESP.getChipModel());
|
||||||
shell.printfln(" Model: %s", getBBQKeesGatewayDetails().c_str());
|
shell.printfln(" Model: %s", getBBQKeesGatewayDetails().c_str());
|
||||||
@@ -1953,24 +1979,6 @@ bool System::command_service(const char * cmd, const char * value) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int n;
|
|
||||||
if (!ok && Helpers::value2number(value, n)) {
|
|
||||||
#ifndef EMSESP_STANDALONE
|
|
||||||
if (!strcmp(cmd, "fuse/mfg")) {
|
|
||||||
ok = esp_efuse_write_reg(EFUSE_BLK3, 0, (uint32_t)n) == ESP_OK;
|
|
||||||
ok ? LOG_INFO("fuse programed with value '%X': successful", n) : LOG_ERROR("fuse programed with value '%X': failed", n);
|
|
||||||
}
|
|
||||||
if (!strcmp(cmd, "fuse/mfgadd")) {
|
|
||||||
uint8_t reg = 0;
|
|
||||||
while (esp_efuse_read_reg(EFUSE_BLK3, reg) != 0 && reg < 7)
|
|
||||||
reg++;
|
|
||||||
ok = esp_efuse_write_reg(EFUSE_BLK3, reg, (uint32_t)n) == ESP_OK;
|
|
||||||
ok ? LOG_INFO("fuse %d programed with value '%X': successful", reg, n) : LOG_ERROR("fuse %d programed with value '%X': failed", reg, n);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ok) {
|
if (ok) {
|
||||||
LOG_INFO("System command '%s' with value '%s'", cmd, value);
|
LOG_INFO("System command '%s' with value '%s'", cmd, value);
|
||||||
}
|
}
|
||||||
@@ -2797,6 +2805,9 @@ bool System::load_board_profile(std::vector<int8_t> & data, const std::string &
|
|||||||
// https://github.com/OLIMEX/ESP32-POE/blob/master/HARDWARE/ESP32-PoE-hardware-revision-L1/ESP32-PoE_Rev_L1.pdf
|
// https://github.com/OLIMEX/ESP32-POE/blob/master/HARDWARE/ESP32-PoE-hardware-revision-L1/ESP32-PoE_Rev_L1.pdf
|
||||||
// uart0 = 1, 3; SD-card = 2, 14, 15; button = 34;
|
// uart0 = 1, 3; SD-card = 2, 14, 15; button = 34;
|
||||||
valid_system_gpios_ = {4, 34, 36, 12, 13, 21, 22, 25, 26, 27, 32, 33, 39};
|
valid_system_gpios_ = {4, 34, 36, 12, 13, 21, 22, 25, 26, 27, 32, 33, 39};
|
||||||
|
} else if (board_profile == "OLIMEXPOEW") {
|
||||||
|
data = {0, 0, 36, 4, 34, PHY_type::PHY_TYPE_LAN8720, 12, 0, 1, 0}; // Olimex ESP32-POE-ISO WROVER (PSRAM)
|
||||||
|
valid_system_gpios_ = {4, 34, 36, 12, 13, 21, 22, 25, 26, 27, 32, 33, 39};
|
||||||
} else if (board_profile == "C3MINI") {
|
} else if (board_profile == "C3MINI") {
|
||||||
#if defined(BOARD_C3_MINI_V1)
|
#if defined(BOARD_C3_MINI_V1)
|
||||||
data = {7, 1, 4, 5, 9, PHY_type::PHY_TYPE_NONE, 0, 0, 0, 0}; // Lolin C3 Mini V1
|
data = {7, 1, 4, 5, 9, PHY_type::PHY_TYPE_NONE, 0, 0, 0, 0}; // Lolin C3 Mini V1
|
||||||
@@ -2889,7 +2900,7 @@ bool System::command_txpause(const char * value, const int8_t) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// format command - factory reset, removing all config files
|
// format command - factory reset, removing all settings files
|
||||||
bool System::command_format(const char * value, const int8_t id) {
|
bool System::command_format(const char * value, const int8_t id) {
|
||||||
if (EMSESP::system_.disable_reset()) {
|
if (EMSESP::system_.disable_reset()) {
|
||||||
LOG_NOTICE("Factory reset disabled");
|
LOG_NOTICE("Factory reset disabled");
|
||||||
@@ -2899,7 +2910,7 @@ bool System::command_format(const char * value, const int8_t id) {
|
|||||||
#if !defined(EMSESP_STANDALONE) && !defined(EMSESP_TEST)
|
#if !defined(EMSESP_STANDALONE) && !defined(EMSESP_TEST)
|
||||||
// don't really format the filesystem in test or standalone mode
|
// don't really format the filesystem in test or standalone mode
|
||||||
if (LittleFS.format()) {
|
if (LittleFS.format()) {
|
||||||
LOG_INFO("Filesystem formatted successfully. All config files removed.");
|
LOG_INFO("Filesystem formatted successfully. All settings files removed.");
|
||||||
} else {
|
} else {
|
||||||
LOG_ERROR("Format failed");
|
LOG_ERROR("Format failed");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -935,7 +935,7 @@ bool Solar::set_heatTransferSystem(const char * value, const int8_t id) {
|
|||||||
if (!Helpers::value2bool(value, b)) {
|
if (!Helpers::value2bool(value, b)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
write_command(0x358, 5, b ? 0x01 : 0x00, 0x358);
|
write_command(0x358, 5, b ? 0xFF : 0x00); // change is broadcasted
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -945,7 +945,7 @@ bool Solar::set_externalCyl(const char * value, const int8_t id) {
|
|||||||
if (!Helpers::value2bool(value, b)) {
|
if (!Helpers::value2bool(value, b)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
write_command(0x358, 9, b ? 0x01 : 0x00, 0x358);
|
write_command(0x358, 9, b ? 0xFF : 0x00); // change is broadcasted
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -955,7 +955,7 @@ bool Solar::set_thermalDisinfect(const char * value, const int8_t id) {
|
|||||||
if (!Helpers::value2bool(value, b)) {
|
if (!Helpers::value2bool(value, b)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
write_command(0x358, 10, b ? 0x01 : 0x00, 0x358);
|
write_command(0x358, 10, b ? 0xFF : 0x00); // change is broadcasted
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -965,7 +965,7 @@ bool Solar::set_heatMetering(const char * value, const int8_t id) {
|
|||||||
if (!Helpers::value2bool(value, b)) {
|
if (!Helpers::value2bool(value, b)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
write_command(0x358, 14, b ? 0x01 : 0x00, 0x358);
|
write_command(0x358, 14, b ? 0xFF : 0x00); // change is broadcasted
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -978,7 +978,7 @@ bool Solar::set_solarEnabled(const char * value, const int8_t id) {
|
|||||||
if (flags() == EMSdevice::EMS_DEVICE_FLAG_SM10) {
|
if (flags() == EMSdevice::EMS_DEVICE_FLAG_SM10) {
|
||||||
write_command(0x96, 0, b ? 0xFF : 0x00, 0x96);
|
write_command(0x96, 0, b ? 0xFF : 0x00, 0x96);
|
||||||
} else {
|
} else {
|
||||||
write_command(0x358, 19, b ? 0x01 : 0x00, 0x358);
|
write_command(0x358, 19, b ? 0xFF : 0x00); // change is broadcasted
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
#define EMSESP_APP_VERSION "3.9.0-dev.5"
|
#define EMSESP_APP_VERSION "3.9.0-dev.8"
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
#include "WebCommandService.h"
|
#include "WebCommandService.h"
|
||||||
|
|
||||||
#include "shuntingYard.h"
|
#include "shuntingYard.h"
|
||||||
|
#include "httpClient.h"
|
||||||
|
|
||||||
namespace emsesp {
|
namespace emsesp {
|
||||||
|
|
||||||
@@ -99,6 +100,13 @@ bool WebCommandService::isUrlCommand(const std::string & command) {
|
|||||||
return lower_url.starts_with("http://") || lower_url.starts_with("https://");
|
return lower_url.starts_with("http://") || lower_url.starts_with("https://");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// true if the command runs the shunting-yard on its own argument. Those values must be passed
|
||||||
|
// through raw: a first pass strips the quotes from literal text, so the command's own pass then
|
||||||
|
// re-parses that text as an expression and chokes on characters like '!' or drops the spaces.
|
||||||
|
bool WebCommandService::computesOwnValue(const std::string & cmd) {
|
||||||
|
return cmd == "system/message" || cmd == "system/sendmail";
|
||||||
|
}
|
||||||
|
|
||||||
// true if a value expression contains an embedded {"url":...} JSON snippet, which compute()
|
// true if a value expression contains an embedded {"url":...} JSON snippet, which compute()
|
||||||
// will resolve with a blocking HTTP request. Mirrors the scan compute() does in shuntingYard.cpp
|
// will resolve with a blocking HTTP request. Mirrors the scan compute() does in shuntingYard.cpp
|
||||||
bool WebCommandService::valueContainsUrl(const std::string & value) {
|
bool WebCommandService::valueContainsUrl(const std::string & value) {
|
||||||
@@ -238,13 +246,13 @@ bool WebCommandService::executeCommand(const char * name, const std::string & co
|
|||||||
// run the value through the shunting-yard calculator so expressions like "custom/heatcnt + 1"
|
// run the value through the shunting-yard calculator so expressions like "custom/heatcnt + 1"
|
||||||
// are resolved (entity references replaced by their values, then computed). Plain values pass
|
// are resolved (entity references replaced by their values, then computed). Plain values pass
|
||||||
// through unchanged. Applies to both URL and internal commands, like the old scheduler code
|
// through unchanged. Applies to both URL and internal commands, like the old scheduler code
|
||||||
// which computed the value before executing. system/message runs the shunting-yard on its own
|
// which computed the value before executing. Commands that compute their own argument are
|
||||||
// argument, so pre-computing it here would run it twice - pass it through raw.
|
// skipped here so the value is only ever evaluated once.
|
||||||
std::string computed_data = data;
|
std::string computed_data = data;
|
||||||
if (!data.empty() && cmd != "system/message") {
|
if (!data.empty() && !computesOwnValue(cmd)) {
|
||||||
computed_data = compute(data);
|
computed_data = compute(data);
|
||||||
if (computed_data.empty()) {
|
if (computed_data.empty()) {
|
||||||
EMSESP::logger().warning("Command '%s': cannot compute value '%s'", name, data.c_str());
|
EMSESP::logger().warning("Command '%s': cannot compute value '%s'. Literal text must be quoted", name, data.c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -267,7 +275,7 @@ bool WebCommandService::executeCommand(const char * name, const std::string & co
|
|||||||
auto lower_url = Helpers::toLower(url.c_str());
|
auto lower_url = Helpers::toLower(url.c_str());
|
||||||
if (lower_url.starts_with("http://") || lower_url.starts_with("https://")) {
|
if (lower_url.starts_with("http://") || lower_url.starts_with("https://")) {
|
||||||
std::string result;
|
std::string result;
|
||||||
int httpResult = http_request(url, method, value, doc["header"].as<JsonObjectConst>(), result);
|
int httpResult = HttpClient::request(url, method, value, doc["header"].as<JsonObjectConst>(), result);
|
||||||
if (httpResult != 200) {
|
if (httpResult != 200) {
|
||||||
EMSESP::logger().warning("Command '%s': URL command failed with http code %d", name, httpResult);
|
EMSESP::logger().warning("Command '%s': URL command failed with http code %d", name, httpResult);
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -85,6 +85,7 @@ class WebCommandService : public StatefulService<WebCommands> {
|
|||||||
|
|
||||||
static bool isUrlCommand(const std::string & command); // true if the command definition is a HTTP/URL command
|
static bool isUrlCommand(const std::string & command); // true if the command definition is a HTTP/URL command
|
||||||
static bool valueContainsUrl(const std::string & value); // true if a value embeds a {"url":...} compute() will fetch
|
static bool valueContainsUrl(const std::string & value); // true if a value embeds a {"url":...} compute() will fetch
|
||||||
|
static bool computesOwnValue(const std::string & cmd); // true if the command runs the shunting-yard itself
|
||||||
|
|
||||||
const CommandItem * find(const char * name);
|
const CommandItem * find(const char * name);
|
||||||
|
|
||||||
|
|||||||
@@ -316,8 +316,9 @@ StateUpdateResult WebSettings::update(JsonObject root, WebSettings & settings) {
|
|||||||
settings.weblog_level = root["weblog_level"] | EMSESP_DEFAULT_WEBLOG_LEVEL;
|
settings.weblog_level = root["weblog_level"] | EMSESP_DEFAULT_WEBLOG_LEVEL;
|
||||||
settings.weblog_compact = root["weblog_compact"] | EMSESP_DEFAULT_WEBLOG_COMPACT;
|
settings.weblog_compact = root["weblog_compact"] | EMSESP_DEFAULT_WEBLOG_COMPACT;
|
||||||
|
|
||||||
settings.email_enabled = root["email_enabled"] | FACTORY_EMAIL_ENABLE;
|
settings.email_enabled = root["email_enabled"] | FACTORY_EMAIL_ENABLE;
|
||||||
settings.email_security = root["email_security"] | FACTORY_EMAIL_SECURITY;
|
// Off is 0, so `| FACTORY_EMAIL_SECURITY` would replace it with STARTTLS (2)
|
||||||
|
settings.email_security = root["email_security"].isNull() ? FACTORY_EMAIL_SECURITY : root["email_security"].as<uint8_t>();
|
||||||
settings.email_server = root["email_server"] | FACTORY_EMAIL_SERVER;
|
settings.email_server = root["email_server"] | FACTORY_EMAIL_SERVER;
|
||||||
settings.email_port = root["email_port"] | FACTORY_EMAIL_PORT;
|
settings.email_port = root["email_port"] | FACTORY_EMAIL_PORT;
|
||||||
settings.email_login = root["email_login"] | FACTORY_EMAIL_LOGIN;
|
settings.email_login = root["email_login"] | FACTORY_EMAIL_LOGIN;
|
||||||
|
|||||||
@@ -20,10 +20,8 @@
|
|||||||
|
|
||||||
#ifndef EMSESP_STANDALONE
|
#ifndef EMSESP_STANDALONE
|
||||||
#include <esp_ota_ops.h>
|
#include <esp_ota_ops.h>
|
||||||
#include <WiFiClient.h>
|
|
||||||
#include <ESP_SSLClient.h>
|
|
||||||
#endif
|
#endif
|
||||||
#include "shuntingYard.h"
|
#include "httpClient.h"
|
||||||
|
|
||||||
namespace emsesp {
|
namespace emsesp {
|
||||||
|
|
||||||
@@ -427,9 +425,9 @@ bool WebStatusService::refresh_versions_cache() {
|
|||||||
#else
|
#else
|
||||||
std::string result;
|
std::string result;
|
||||||
JsonDocument doc;
|
JsonDocument doc;
|
||||||
auto http_code = http_request(VERSIONS_URL, "GET", "", doc.as<JsonObjectConst>(), result);
|
auto http_code = HttpClient::request(VERSIONS_URL, "GET", "", doc.as<JsonObjectConst>(), result);
|
||||||
if (http_code != 200) {
|
if (http_code != 200) {
|
||||||
EMSESP::logger().warning("refresh_versions_cache() HTTP error code %d", http_code);
|
EMSESP::logger().warning("Unable to retrieve online version information (HTTP error code %d)", http_code);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
DeserializationError err = deserializeJson(doc, result);
|
DeserializationError err = deserializeJson(doc, result);
|
||||||
|
|||||||
@@ -120,6 +120,31 @@ void shuntingYard_test28() {
|
|||||||
run_shuntingYard_test("", "-x");
|
run_shuntingYard_test("", "-x");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// quoted text keeps its spaces and punctuation, unquoted text does not
|
||||||
|
void shuntingYard_test29() {
|
||||||
|
run_shuntingYard_test("email test!", "\"email test!\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
// a trailing '!' on unquoted text is read as a logical NOT and has no valid operand
|
||||||
|
void shuntingYard_test30() {
|
||||||
|
run_shuntingYard_test("", "email test!");
|
||||||
|
}
|
||||||
|
|
||||||
|
// computing an already computed value is lossy - callers must run compute() only once
|
||||||
|
void shuntingYard_test31() {
|
||||||
|
run_shuntingYard_test("", emsesp::compute("\"email test!\""));
|
||||||
|
}
|
||||||
|
|
||||||
|
// a '?' inside quotes is literal text, not a ternary
|
||||||
|
void shuntingYard_test32() {
|
||||||
|
run_shuntingYard_test("Is it hot?", "\"Is it hot?\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
// mixing quoted text with entity values keeps the punctuation of both parts
|
||||||
|
void shuntingYard_test33() {
|
||||||
|
run_shuntingYard_test("temp is 40 C!", "\"temp is \" + boiler/flowtempoffset + \" C!\"");
|
||||||
|
}
|
||||||
|
|
||||||
void run_shuntingYard_tests() {
|
void run_shuntingYard_tests() {
|
||||||
RUN_TEST(shuntingYard_test1);
|
RUN_TEST(shuntingYard_test1);
|
||||||
RUN_TEST(shuntingYard_test2);
|
RUN_TEST(shuntingYard_test2);
|
||||||
@@ -149,4 +174,9 @@ void run_shuntingYard_tests() {
|
|||||||
RUN_TEST(shuntingYard_test26);
|
RUN_TEST(shuntingYard_test26);
|
||||||
RUN_TEST(shuntingYard_test27);
|
RUN_TEST(shuntingYard_test27);
|
||||||
RUN_TEST(shuntingYard_test28);
|
RUN_TEST(shuntingYard_test28);
|
||||||
|
RUN_TEST(shuntingYard_test29);
|
||||||
|
RUN_TEST(shuntingYard_test30);
|
||||||
|
RUN_TEST(shuntingYard_test31);
|
||||||
|
RUN_TEST(shuntingYard_test32);
|
||||||
|
RUN_TEST(shuntingYard_test33);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user