Compare commits

...
35 Commits
Author SHA1 Message Date
Proddy ef11879dc0 Merge pull request #3226 from proddy/dev
don't use Eth if not on ESP32
2026-09-08 22:09:02 +02:00
proddy e3d9f03097 don't use Eth if not on ESP32 2026-09-08 22:08:22 +02:00
Proddy f90b7e9d91 Merge pull request #3217 from proddy/dev
Cleaner MD5 and Firmware upload messages in WebUI
2026-09-08 21:15:35 +02:00
Proddy e489c0f77d Merge branch 'dev' into dev 2026-09-08 21:14:49 +02:00
proddy 99dd04cbf5 remove writing efuse 2026-09-08 21:08:58 +02:00
proddy 4dac338e2c remove comments 2026-09-08 21:08:44 +02:00
proddy ff47722693 package update 2026-09-08 21:08:33 +02:00
Proddy 6aed13a9b2 Merge pull request #3225 from MichaelDvP/dev
fix solar enable #3223
2026-09-05 12:04:21 +02:00
proddy dbf54f09f5 auto-formatting 2026-09-05 11:02:33 +02:00
proddy 204ad1f8c9 add psram so standalone compiles 2026-09-05 11:02:20 +02:00
proddy 928e1e7a69 update 2026-09-05 11:02:07 +02:00
proddy a6ea91439b pkg update 2026-09-05 10:58:14 +02:00
MichaelDvP 7735c9e8f2 Merge remote-tracking branch 'mdvp/dev' into dev 2026-09-05 10:24:57 +02:00
MichaelDvP a22cab95fa Merge remote-tracking branch 'emsesp/dev' into dev 2026-09-05 10:22:39 +02:00
MichaelDvP 629c20ee11 chore: update generated files for v3.9.0-dev.8 2026-09-05 08:13:19 +00:00
Proddy 5d75583dba Merge branch 'emsesp:dev' into dev 2026-09-05 10:00:05 +02:00
Proddy 2ec8450b78 Merge pull request #3220 from pepe82sh/fix/olimexpoe-wrover-psram-eth-clock
Add OLIMEXPOEW board profile; guard against PSRAM/Ethernet clock GPIO conflict
2026-09-05 09:59:53 +02:00
MichaelDvP f911950aee solar enable #3223 2026-09-05 09:56:44 +02:00
MichaelDvP d1b97daff0 formatting 2026-09-05 09:54:34 +02:00
MichaelDvP 7caa5a1ba0 check for nvs1 partition 2026-09-05 09:53:51 +02:00
MichaelDvP 3ba7099987 show mqtt stop 2026-09-05 09:53:31 +02:00
proddy 0a50a9b1fa update 2026-09-04 16:30:58 +02:00
proddy 6291bdfa5d pkg update 2026-09-04 16:27:14 +02:00
proddy 81fa7c592e update for heating block rename 2026-09-04 16:27:02 +02:00
proddy 1b345f788d added heatblock temp translations 2026-09-04 13:48:25 +02:00
Proddy 7a709ba497 Merge branch 'emsesp:dev' into dev 2026-09-04 13:37:19 +02:00
proddy b4548ed257 formatting 2026-09-04 13:35:51 +02:00
proddy 9d3a49a0de remove lambda check 2026-09-04 13:32:11 +02:00
proddy 355029ca9f update 2026-09-04 13:30:34 +02:00
proddy 889ddee86e 3.9.0-dev.8 2026-09-04 13:30:28 +02:00
proddy e43226af7e add missing translations 2026-09-04 13:28:31 +02:00
proddy 09e1ee9914 rename EXECUTE to RUN 2026-09-04 13:28:21 +02:00
proddy dc623cb32a pkg update 2026-09-04 13:27:59 +02:00
Michael PapeandClaude Sonnet 5 c1e514d8bf add OLIMEXPOEW board profile, guard against PSRAM/eth clock GPIO conflict
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GnozuURE2WF6AWJzxSu6fP
2026-09-04 13:20:49 +02:00
proddy cc2865ebdd #3216 2026-09-03 21:24:40 +02:00
42 changed files with 980 additions and 649 deletions
+2
View File
@@ -13,6 +13,7 @@ This release is based on the latest Espressif/Arduino core version 3. It brings
- option to disable factory reset [#3150](https://github.com/emsesp/EMS-ESP32/issues/3150)
- TLS support with 4MB boards without PSRAM
- added eth_10mbit to Network Settings, which forces 10BASE-T half-duplex & autonegotiation off, halving the PHYs power draw. Its 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
@@ -24,6 +25,7 @@ This release is based on the latest Espressif/Arduino core version 3. It brings
- "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
- 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
+1 -1
View File
@@ -113,7 +113,7 @@ CPPFLAGS += $(DEFINES) $(DEFAULTS) $(INCLUDE)
CPPFLAGS += -ggdb -g3 -MMD
CPPFLAGS += -flto=auto
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 += -Os -DNDEBUG
+27 -27
View File
@@ -317,7 +317,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -477,7 +477,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -637,7 +637,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -797,7 +797,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -957,7 +957,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -1117,7 +1117,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -1277,7 +1277,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -1437,7 +1437,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -1597,7 +1597,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -1757,7 +1757,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -1917,7 +1917,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -2077,7 +2077,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -2237,7 +2237,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -2397,7 +2397,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -2557,7 +2557,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -2717,7 +2717,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -2877,7 +2877,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -3037,7 +3037,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -3197,7 +3197,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -3357,7 +3357,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -4067,7 +4067,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -4227,7 +4227,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -4387,7 +4387,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -4547,7 +4547,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -4707,7 +4707,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -4867,7 +4867,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
@@ -5155,7 +5155,7 @@ uint8
uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 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
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8
+27 -27
View File
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
@@ -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,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,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,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
Can't render this file because it is too large.
+5 -5
View File
@@ -42,11 +42,11 @@
"@eslint/js": "^10.0.1",
"@preact/preset-vite": "^2.10.6",
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
"@types/node": "^26.4.1",
"@types/node": "^26.5.0",
"@types/react": "^19.2.18",
"@types/react-dom": "^19.2.5",
"@types/react-dom": "^19.2.7",
"concurrently": "^10.0.5",
"eslint": "^10.9.1",
"eslint": "^10.10.0",
"eslint-config-prettier": "^10.1.8",
"etag": "^1.8.1",
"mime-types": "^3.0.2",
@@ -54,9 +54,9 @@
"rollup-plugin-visualizer": "^7.1.1",
"terser": "^5.51.2",
"typescript": "^6.0.3",
"typescript-eslint": "^8.69.0",
"typescript-eslint": "^8.70.0",
"vite": "^8.2.2",
"vite-plugin-imagemin": "^0.6.1"
},
"packageManager": "pnpm@11.25.0+sha512.5cde925b4f075f725eb71fbae18a42ffe784524789f19b61c731cb8721ec28aaee160e01a8d5af4fedb2a42cdbf300efe23db356b0d4a17b4d63e11f8ab7c956"
"packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457"
}
+416 -267
View File
File diff suppressed because it is too large Load Diff
+2 -1
View File
@@ -19,6 +19,7 @@ export const uploadFile = (file: File) => {
const formData = new FormData();
formData.append('file', file);
return alovaInstance.Post('/rest/uploadFile', formData, {
timeout: UPLOAD_TIMEOUT
timeout: UPLOAD_TIMEOUT,
enableUpload: true
});
};
+1
View File
@@ -307,6 +307,7 @@ export const BOARD_PROFILES = {
LOLIN: 'Lolin D32',
OLIMEX: 'Olimex ESP32-EVB',
OLIMEXPOE: 'Olimex ESP32-POE',
OLIMEXPOEW: 'Olimex ESP32-POE-ISO WROVER (PSRAM)',
C3MINI: 'Wemos C3 Mini',
S2MINI: 'Wemos S2 Mini',
S3MINI: 'Liligo S3'
@@ -165,11 +165,7 @@ const DownloadUpload = () => {
{LL.UPLOAD()}
</Typography>
<Typography sx={{ pb: 2 }} color="warning" variant="body1">
{LL.UPLOAD_TEXT()}:
</Typography>
<SingleUpload doRestart={doRestart} />
<SingleUpload text={LL.UPLOAD_BACKUP_TEXT()} doRestart={doRestart} />
</SectionContent>
);
};
+1 -1
View File
@@ -846,7 +846,7 @@ const Version = () => {
<Typography sx={{ pt: 2, pb: 2 }} variant="h6" color="primary">
{LL.UPLOAD()}
</Typography>
<SingleUpload doRestart={doRestart} />
<SingleUpload text={LL.UPLOAD_FIRMWARE_TEXT()} doRestart={doRestart} />
</>
)}
</Box>
+1 -1
View File
@@ -369,7 +369,7 @@ const SystemLog = () => {
) : (
<>
{data.developer_mode && (
<IconButton onClick={sendReadCommand} aria-label={LL.EXECUTE()}>
<IconButton onClick={sendReadCommand} aria-label={LL.RUN()}>
<PlayArrowIcon color="primary" />
</IconButton>
)}
@@ -14,9 +14,10 @@ import { LinearProgressWithLabel } from './LinearProgressWithLabel';
interface SingleUploadProps {
doRestart: () => void;
text: string;
}
const SingleUpload = ({ doRestart }: SingleUploadProps) => {
const SingleUpload = ({ doRestart, text }: SingleUploadProps) => {
const [md5, setMd5] = useState<string>();
const [file, setFile] = useState<File>();
const { LL } = useI18nContext();
@@ -29,11 +30,22 @@ const SingleUpload = ({ doRestart }: SingleUploadProps) => {
} = useRequest(SystemApi.uploadFile, {
immediate: false
}).onSuccess(({ data }) => {
if (data && typeof data === 'object' && 'md5' in data) {
setMd5((data as { md5: string }).md5);
toast.success(LL.UPLOAD() + ' MD5 ' + LL.SUCCESSFUL());
let payload = data;
if (typeof payload === 'string' && payload.length > 0) {
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);
} else {
if (payload && typeof payload === 'object' && 'md5_ok' in payload) {
toast.success(LL.UPLOAD_MD5_MATCHED());
}
doRestart();
}
});
@@ -80,12 +92,17 @@ const SingleUpload = ({ doRestart }: SingleUploadProps) => {
</Button>
</>
) : (
<DragNdrop text={LL.UPLOAD_DROP_TEXT()} onFileSelected={setFile} />
<DragNdrop
text={(md5 ? LL.UPLOAD_MD5_RECEIVED() : text) + '...'}
onFileSelected={setFile}
/>
)}
{md5 && (
<Box sx={{ mt: 2 }}>
<Typography variant="body2">{'MD5: ' + md5}</Typography>
<Typography variant="body2" color="success">
{'MD5: ' + md5}
</Typography>
</Box>
)}
</>
+5 -3
View File
@@ -178,8 +178,6 @@ const cs: Translation = {
DOWNLOAD_SETTINGS_TEXT: 'Vytvořte zálohu svého nastavení a konfigurace',
DOWNLOAD_SETTINGS_TEXT2: 'Exportovat všechny hodnoty',
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',
TIME_SET: 'Čas nastaven',
MANAGE_USERS: 'Spravovat uživatele',
@@ -349,7 +347,11 @@ const cs: Translation = {
COMMANDS_HELP_1: 'Definujte vlastní příkazy pro magistrali EMS',
COMMAND_EXECUTED: 'Příkaz úspěšně spuštěn',
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;
+5 -3
View File
@@ -178,8 +178,6 @@ const de: Translation = {
DOWNLOAD_SETTINGS_TEXT: 'Erstellen Sie eine Sicherung Ihrer Konfigurationen und Einstellungen',
DOWNLOAD_SETTINGS_TEXT2: 'Exportiere alle Werte',
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.',
TIME_SET: 'Zeit gesetzt',
MANAGE_USERS: 'Nutzerverwaltung',
@@ -349,7 +347,11 @@ const de: Translation = {
COMMANDS_HELP_1: 'Definieren Sie eigene Befehle für die EMS-Magistral',
COMMAND_EXECUTED: 'Befehl erfolgreich ausgeführt',
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;
+5 -3
View File
@@ -178,8 +178,6 @@ const en: Translation = {
DOWNLOAD_SETTINGS_TEXT: 'Create a backup of your configuration and settings',
DOWNLOAD_SETTINGS_TEXT2: 'Export all values',
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',
TIME_SET: 'Time set',
MANAGE_USERS: 'Manage Users',
@@ -349,7 +347,11 @@ const en: Translation = {
COMMANDS_HELP_1: 'Define reusable named commands below. These can be executed from the console, API/MQTT, or referenced by the Scheduler',
COMMAND_EXECUTED: 'Command executed successfully',
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;
+5 -3
View File
@@ -178,8 +178,6 @@ const fr: Translation = {
DOWNLOAD_SETTINGS_TEXT: 'Créer une sauvegarde de vos paramètres et configurations',
DOWNLOAD_SETTINGS_TEXT2: 'Exporter toutes les valeurs',
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',
TIME_SET: 'Time set',
MANAGE_USERS: 'Gérer les utilisateurs',
@@ -349,7 +347,11 @@ const fr: Translation = {
COMMANDS_HELP_1: 'Définir des commandes personnalisées pour la magistral EMS',
COMMAND_EXECUTED: 'Commande exécutée avec succès',
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;
+5 -3
View File
@@ -178,8 +178,6 @@ const it: Translation = {
DOWNLOAD_SETTINGS_TEXT: 'Create a backup of your configuration and settings',
DOWNLOAD_SETTINGS_TEXT2: 'Esporta tutti i valori',
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',
TIME_SET: 'Imposta Ora',
MANAGE_USERS: 'Gestione Utenti',
@@ -349,7 +347,11 @@ const it: Translation = {
COMMANDS_HELP_1: 'Definisci comandi personalizzati per la magistrali EMS',
COMMAND_EXECUTED: 'Comando eseguito con successo',
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;
+5 -3
View File
@@ -178,8 +178,6 @@ const nl: Translation = {
DOWNLOAD_SETTINGS_TEXT: 'Maak een back-up van uw configuratie en instellingen',
DOWNLOAD_SETTINGS_TEXT2: 'Exporteer alle waarden',
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',
TIME_SET: 'Tijd ingesteld',
MANAGE_USERS: 'Gebruikersbeheer',
@@ -349,7 +347,11 @@ const nl: Translation = {
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_EXECUTED: 'Commando uitgevoerd succesvol',
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;
+5 -3
View File
@@ -178,8 +178,6 @@ const no: Translation = {
DOWNLOAD_SETTINGS_TEXT: 'Lag en sikkerhetskopi av dine konfigurasjon og innstillinger',
DOWNLOAD_SETTINGS_TEXT2: 'Eksporter alle verdier',
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',
TIME_SET: 'Still in tid',
MANAGE_USERS: 'Administrer Brukere',
@@ -349,7 +347,11 @@ const no: Translation = {
COMMANDS_HELP_1: 'Definer egne kommandoer for EMS-Magistral',
COMMAND_EXECUTED: 'Kommando kjørt lykkes',
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;
+5 -3
View File
@@ -178,8 +178,6 @@ const pl: BaseTranslation = {
DOWNLOAD_SETTINGS_TEXT: 'Utwórz kopię swoich ustawień i konfiguracji',
DOWNLOAD_SETTINGS_TEXT2: 'Eksportuj wszystkie wartości',
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!',
TIME_SET: 'Zegar został ustawiony.',
MANAGE_USERS: 'Zarządzanie użytkownikami',
@@ -349,7 +347,11 @@ const pl: BaseTranslation = {
COMMANDS_HELP_1: 'Zdefiniuj niestandardowe komendy dla magistrali EMS',
COMMAND_EXECUTED: 'Komenda wykonana pomyślnie',
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;
+5 -3
View File
@@ -178,8 +178,6 @@ const sk: Translation = {
DOWNLOAD_SETTINGS_TEXT: 'Vytvorte zálohu svojej konfigurácie a nastavení',
DOWNLOAD_SETTINGS_TEXT2: 'Exportovať všetky hodnoty',
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',
TIME_SET: 'Nastavený čas',
MANAGE_USERS: 'Správa používateľov',
@@ -349,7 +347,11 @@ const sk: Translation = {
COMMANDS_HELP_1: 'Definujte vlastné príkazy pre magistrali EMS',
COMMAND_EXECUTED: 'Príkaz vykonaný úspešne',
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;
+5 -3
View File
@@ -178,8 +178,6 @@ const sv: Translation = {
DOWNLOAD_SETTINGS_TEXT: 'Skapa en säkerhetskopia av din konfiguration och inställningar',
DOWNLOAD_SETTINGS_TEXT2: 'Exportera alla värden',
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',
TIME_SET: 'Ställ in tid',
MANAGE_USERS: 'Användare',
@@ -349,7 +347,11 @@ const sv: Translation = {
COMMANDS_HELP_1: 'Definiera egna kommandon för EMS-Magistral',
COMMAND_EXECUTED: 'Kommando kört lyckades',
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;
+5 -3
View File
@@ -178,8 +178,6 @@ const tr: Translation = {
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_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.',
TIME_SET: 'Zaman ayarı',
MANAGE_USERS: 'Kullanıcıları yönet',
@@ -349,7 +347,11 @@ const tr: Translation = {
COMMANDS_HELP_1: 'Özel komutları EMS hattına tanımlayın',
COMMAND_EXECUTED: 'Komut başarıyla çalıştırıldı',
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;
+1
View File
@@ -57,6 +57,7 @@
"assumeChangesOnlyAffectDirectDependencies": true,
// Path mapping for cleaner imports
"ignoreDeprecations": "6.0",
"baseUrl": ".",
"paths": {
"@/*": ["src/*"],
-3
View File
@@ -207,9 +207,6 @@ export default defineConfig(
async ({ command, mode }: { command: string; mode: string }) => {
if (command === 'serve') {
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(
path.resolve(import.meta.dirname, '../mock-api/mockServer.js')
).href;
+1
View File
@@ -29,6 +29,7 @@
NativeConsole Serial;
EspClass ESP;
ETHClass ETH;
WiFiClass WiFi;
+9
View File
@@ -34,6 +34,15 @@
#include "WString.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 WiFiClass WiFi;
+106 -115
View File
@@ -1,27 +1,11 @@
// Mock server for development
// Simulates file uploads and EventSource (SSE) for log messages
import formidable from 'formidable';
// Constants reused across requests
const VALID_EXTENSIONS = new Set(['bin', 'json', 'md5']);
// EMS-ESP standalone mode to simulate
// a REST server for file uploads
// an EventSource (Server-Sent Events) for log messages in EMS-ESP standalone mode
const ONE_SECOND_MS = 1000;
const TEN_PERCENT = 10;
// padding function
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
const formatDate = (date) => {
const year = date.getUTCFullYear();
@@ -38,108 +22,115 @@ const formatDate = (date) => {
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 () => {
return {
name: 'vite:mockserver',
name: 'vite:mockServer',
configureServer: async (server) => {
server.middlewares.use(async (req, res, next) => {
// Handle file uploads
if (req.url.startsWith('/rest/uploadFile')) {
// CORS preflight support
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');
}
if (req.url.startsWith('/rest/uploadFile') && req.method === 'POST') {
await forwardThrottledUpload(req, res);
return;
}
// Handle Server-Sent Events (SSE) for log streaming
else if (req.url.startsWith('/es/log')) {
if (req.url.startsWith('/es/log')) {
// Set SSE headers
res.writeHead(200, {
Connection: 'keep-alive',
@@ -210,7 +201,7 @@ export default () => {
res.on('error', cleanup);
res.on('finish', cleanup);
} else {
next(); // Continue to next middleware
next(); // Continue to next middleware (Vite proxy → restServer)
}
});
}
+1 -2
View File
@@ -11,12 +11,11 @@
},
"dependencies": {
"@msgpack/msgpack": "^3.1.3",
"formidable": "^3.5.4",
"itty-router": "^5.0.24"
},
"devDependencies": {
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
"prettier": "^3.9.6"
},
"packageManager": "pnpm@11.25.0+sha512.5cde925b4f075f725eb71fbae18a42ffe784524789f19b61c731cb8721ec28aaee160e01a8d5af4fedb2a42cdbf300efe23db356b0d4a17b4d63e11f8ab7c956"
"packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457"
}
+101 -51
View File
@@ -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'
settings:
@@ -11,9 +112,6 @@ importers:
'@msgpack/msgpack':
specifier: ^3.1.3
version: 3.1.3
formidable:
specifier: ^3.5.4
version: 3.5.4
itty-router:
specifier: ^5.0.24
version: 5.0.24
@@ -81,13 +179,6 @@ packages:
resolution: {integrity: sha512-47XIizs9XZXvuJgoaJUIE2lFoID8ugvc0jzSHP+Ptfk8nTbnR8g788wv48N03Kx0UkAv559HWRQ3yzOgzlRNUA==}
engines: {node: '>= 18'}
'@noble/hashes@1.8.0':
resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==}
engines: {node: ^14.21.3 || >=16}
'@paralleldrive/cuid2@2.3.1':
resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==}
'@trivago/prettier-plugin-sort-imports@6.0.2':
resolution: {integrity: sha512-3DgfkukFyC/sE/VuYjaUUWoFfuVjPK55vOFDsxD56XXynFMCZDYFogH2l/hDfOsQAm1myoU/1xByJ3tWqtulXA==}
engines: {node: '>= 20'}
@@ -107,9 +198,6 @@ packages:
svelte:
optional: true
asap@2.0.6:
resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
@@ -125,13 +213,6 @@ packages:
supports-color:
optional: true
dezalgo@1.0.4:
resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==}
formidable@3.5.4:
resolution: {integrity: sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==}
engines: {node: '>=14.0.0'}
itty-router@5.0.24:
resolution: {integrity: sha512-PXij1qGKtE6jg3dLgrTRdh/Frovl5Wc4Av67sD2xfhDPrgNt4u79++/il8/c/OfZGkhD/8uYJub8tjo+H165rA==}
@@ -156,9 +237,6 @@ packages:
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
once@1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
parse-imports-exports@0.2.4:
resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==}
@@ -173,9 +251,6 @@ packages:
engines: {node: '>=14'}
hasBin: true
wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
snapshots:
'@babel/code-frame@7.29.7':
@@ -241,12 +316,6 @@ snapshots:
'@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)':
dependencies:
'@babel/generator': 7.29.8
@@ -261,8 +330,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
asap@2.0.6: {}
balanced-match@1.0.2: {}
brace-expansion@2.1.4:
@@ -273,17 +340,6 @@ snapshots:
dependencies:
ms: 2.1.3
dezalgo@1.0.4:
dependencies:
asap: 2.0.6
wrappy: 1.0.2
formidable@3.5.4:
dependencies:
'@paralleldrive/cuid2': 2.3.1
dezalgo: 1.0.4
once: 1.4.0
itty-router@5.0.24: {}
javascript-natural-sort@0.7.1: {}
@@ -300,10 +356,6 @@ snapshots:
ms@2.1.3: {}
once@1.4.0:
dependencies:
wrappy: 1.0.2
parse-imports-exports@0.2.4:
dependencies:
parse-statements: 1.0.11
@@ -313,5 +365,3 @@ snapshots:
picocolors@1.1.1: {}
prettier@3.9.6: {}
wrappy@1.0.2: {}
+81 -24
View File
@@ -239,6 +239,17 @@ switch (emulate_esp) {
// GLOBAL VARIABLES
let countWifiScanPoll = 0; // wifi network scan
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
const enum ScheduleFlag {
@@ -329,10 +340,10 @@ function updateMask(entity: any, de: any, dd: any) {
const old_custom_name = dd.nodes[dd_objIndex].cn;
console.log(
'comparing names, old (' +
old_custom_name +
') with new (' +
new_custom_name +
')'
old_custom_name +
') with new (' +
new_custom_name +
')'
);
if (old_custom_name !== new_custom_name) {
changed = true;
@@ -434,24 +445,28 @@ function upgradeImportantMessages(version: string) {
// 0 is do nothing
// 1 means 3.9 and factory reset required
// 2 means a major version upgrade
let upgradeImportantMessageType_n = 0;
// see if its a filename with a .bin extension
if (version.endsWith('.bin')) {
upgradeImportantMessageType_n = 1; // make it 1, for testing, meaning factory reset required
} else if (version.endsWith('.md')) {
upgradeImportantMessageType_n = 0; // use default 0, no message
// check file extensions
if (version.endsWith('.md5') || version.endsWith('.json')) {
upgradeImportantMessageType_n = 0; // digest / backup restore: no upgrade warning
} else if (version.endsWith('.bin')) {
// 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 {
// 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
}
console.log(
'upgradeImportantMessageType: version=' +
version +
' type=' +
upgradeImportantMessageType_n
version +
' type=' +
upgradeImportantMessageType_n
);
return { upgradeImportantMessageType: upgradeImportantMessageType_n };
}
@@ -502,17 +517,17 @@ function get_versions() {
console.log(
'getVersions: current=' +
THIS_VERSION +
' stable=' +
LATEST_STABLE_VERSION +
' (upgradeable=' +
(STABLE_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO') +
') dev=' +
LATEST_DEV_VERSION +
' (upgradeable=' +
(DEV_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO') +
')' +
(MOCK_OFFLINE ? ' [offline]' : '')
THIS_VERSION +
' stable=' +
LATEST_STABLE_VERSION +
' (upgradeable=' +
(STABLE_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO') +
') dev=' +
LATEST_DEV_VERSION +
' (upgradeable=' +
(DEV_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO') +
')' +
(MOCK_OFFLINE ? ' [offline]' : '')
);
return data;
}
@@ -774,6 +789,7 @@ const EMSESP_COMMANDS_ENDPOINT = REST_ENDPOINT_ROOT + 'commands';
const EMSESP_CUSTOMENTITIES_ENDPOINT = REST_ENDPOINT_ROOT + 'customEntities';
const EMSESP_MODULES_ENDPOINT = REST_ENDPOINT_ROOT + 'modules';
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
const EMSESP_SYSTEM_INFO_ENDPOINT = API_ENDPOINT_ROOT + 'system/info';
@@ -4637,6 +4653,47 @@ router
// SYSTEM and SETTINGS
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(SYSTEM_STATUS_ENDPOINT, async () => {
if (countHardwarePoll >= 2) {
+4 -2
View File
@@ -744,7 +744,7 @@ mlongcalls
mmio
mmode
mmplus
mockserver
mockServer
modbus
modee
modetype
@@ -1347,4 +1347,6 @@ roomtempoffset
dhcpc
wifioff
autonegotiation
Mbit
Mbit
WROVER
OLIMEXPOEW
+5 -1
View File
@@ -84,7 +84,7 @@ void MqttSettingsService::loop() {
}
if (_reconfigureMqtt || (_disconnectedAt && static_cast<uint32_t>(uuid::get_uptime() - _disconnectedAt) >= MQTT_RECONNECTION_DELAY)) {
// configure MQTT client
if (_reconfigureMqtt) {
if (_reconfigureMqtt && _state.enabled) {
emsesp::EMSESP::logger().info("Starting MQTT service");
}
_disconnectedAt = configureMqtt() ? 0 : uuid::get_uptime();
@@ -130,6 +130,7 @@ MqttClient * MqttSettingsService::getMqttClient() {
void MqttSettingsService::onMqttConnect(bool sessionPresent) {
(void)sessionPresent;
emsesp::EMSESP::mqtt_.on_connect();
_disconnectReason = espMqttClientTypes::DisconnectReason::USER_OK;
}
void MqttSettingsService::onMqttDisconnect(espMqttClientTypes::DisconnectReason reason) {
@@ -158,6 +159,9 @@ bool MqttSettingsService::configureMqtt() {
emsesp::EMSESP::logger().debug("Disconnecting to configure");
#endif
_mqttClient->disconnect(true);
if (!_state.enabled) {
emsesp::EMSESP::logger().info("Stopping MQTT client");
}
}
// only connect if WiFi is connected and MQTT is enabled
+47 -7
View File
@@ -13,10 +13,32 @@ static String getFilenameExtension(const String & filename) {
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)
: _securityManager(securityManager)
, _is_firmware(false)
, _is_filesystem(false)
, _md5_applied(false)
, _md5() {
server->on(
UPLOAD_FILE_PATH,
@@ -48,18 +70,23 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri
// LittleFS filesystem image
_is_filesystem = true;
_md5[0] = '\0'; // clear any stale md5 so Update.end() doesn't compare against it
_md5_applied = false;
} else if ((extension == "bin") && (filesize > 1000000)) {
_is_firmware = true;
} else if (extension == "json") {
_md5[0] = '\0'; // clear md5
_md5[0] = '\0'; // clear md5
_md5_applied = false;
} else if (extension == "md5") {
if (len == _md5.size() - 1) {
std::memcpy(_md5.data(), data, _md5.size() - 1);
_md5.back() = '\0';
if (!parseMd5Digest(data, len, _md5)) {
emsesp::EMSESP::logger().err("Invalid MD5 digest file");
handleError(request, 406); // Not Acceptable
} else {
emsesp::EMSESP::logger().info("MD5 digest received (%s). Now upload the firmware BIN", _md5.data());
}
return;
} else {
_md5.front() = '\0';
_md5_applied = false;
emsesp::EMSESP::logger().err("Unsupported file type: %s, size: %u", filename.c_str(), filesize);
handleError(request, 406); // Not Acceptable - unsupported file type
return;
@@ -103,9 +130,11 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri
emsesp::EMSESP::system_.systemStatus(emsesp::SYSTEM_STATUS::SYSTEM_STATUS_UPLOADING);
if (Update.begin(filesize - sizeof(esp_image_header_t))) {
_md5_applied = false;
if (strlen(_md5.data()) == _md5.size() - 1) {
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
} else {
@@ -183,8 +212,19 @@ void UploadFileService::uploadComplete(AsyncWebServerRequest * request) {
emsesp::EMSESP::nvs_.putBool(emsesp::EMSESP_NVS_BOOT_NEW_FIRMWARE, true);
}
AsyncWebServerResponse * response = request->beginResponse(200);
request->send(response);
if (_is_firmware && _md5_applied) {
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::SYSTEM_STATUS::SYSTEM_STATUS_PENDING_RESTART); // will be handled by the main loop. We use pending for the Web's SystemMonitor
return;
+1
View File
@@ -23,6 +23,7 @@ class UploadFileService {
SecurityManager * _securityManager;
bool _is_firmware;
bool _is_filesystem;
bool _md5_applied; // true if an MD5 digest was applied to the current firmware upload
std::array<char, 33> _md5;
void handleUpload(AsyncWebServerRequest * request, const String & filename, size_t index, uint8_t * data, size_t len, bool final);
+28 -29
View File
@@ -295,36 +295,35 @@ static void setup_commands(std::shared_ptr<Commands> const & commands) {
});
commands->add_command(
ShellContext::MAIN,
CommandFlags::ADMIN,
string_vector{F_(set), F_(board_profile)},
{F_(name_mandatory)},
[](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::string board_profile = Helpers::toUpper(arguments.front());
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, C3MINI, S2MINI, S3MINI, S32S3, CUSTOM)");
return;
}
commands->add_command(ShellContext::MAIN,
CommandFlags::ADMIN,
string_vector{F_(set), F_(board_profile)},
{F_(name_mandatory)},
[](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::string board_profile = Helpers::toUpper(arguments.front());
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, "
"C3MINI, S2MINI, S3MINI, S32S3, CUSTOM)");
return;
}
EMSESP::webSettingsService.update([&](WebSettings & settings) {
settings.board_profile = board_profile.c_str();
settings.led_gpio = data[0];
settings.dallas_gpio = data[1];
settings.rx_gpio = data[2];
settings.tx_gpio = data[3];
settings.pbutton_gpio = data[4];
settings.phy_type = data[5];
settings.eth_power = data[6]; // can be -1
settings.eth_phy_addr = data[7];
settings.eth_clock_mode = data[8];
return StateUpdateResult::CHANGED;
});
shell.printfln("Loaded board profile %s. Restarting...", board_profile.c_str());
EMSESP::system_.system_restart();
});
EMSESP::webSettingsService.update([&](WebSettings & settings) {
settings.board_profile = board_profile.c_str();
settings.led_gpio = data[0];
settings.dallas_gpio = data[1];
settings.rx_gpio = data[2];
settings.tx_gpio = data[3];
settings.pbutton_gpio = data[4];
settings.phy_type = data[5];
settings.eth_power = data[6]; // can be -1
settings.eth_phy_addr = data[7];
settings.eth_clock_mode = data[8];
return StateUpdateResult::CHANGED;
});
shell.printfln("Loaded board profile %s. Restarting...", board_profile.c_str());
EMSESP::system_.system_restart();
});
commands->add_command(
ShellContext::MAIN,
+8 -12
View File
@@ -1740,15 +1740,16 @@ void EMSESP::start() {
bool factory_settings = false;
#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
if (!nvs_.begin("ems-esp", false, "nvs1")) { // try bigger nvs partition on 16M flash first
nvs_.begin("ems-esp", false, "nvs"); // fallback to small nvs
#ifndef EMSESP_STANDALONE
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
system_.set_valid_system_gpios();
@@ -1759,11 +1760,6 @@ void EMSESP::start() {
// loads core system services settings (mqtt, ap, ntp etc)
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
if (factory_settings) {
LOG_WARNING("No settings found on filesystem. Using factory settings.");
+1 -1
View File
@@ -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(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(heatblock, "heatblock", "Heatblok temperature", "Wärmeblocktemperatur", "Aanvoertemp. warmtecel", "Värmeblock", "blok grzewczy", "varmeblokk", "départ corps de chauffe", "Hid.denge kabı sıcaklığı", "mandata scamb. pr.", "vykurovací blok", "blok tope")
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(pumpKickDay, "pumpkickday", "pump kick day", "Tag Pumpkick")
MAKE_TRANSLATION(pumpKickDelay, "pumpkickdelay", "pump kick delay", "Pause vor Pumpkick")
+11 -1
View File
@@ -229,9 +229,14 @@ void Network::reconnect() {
// 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)
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;
}
#endif
if (!ssid_.isEmpty() || ap_provisionMode_ == AP_MODE_NEVER) {
return NetPhase::WIFI;
}
@@ -600,6 +605,11 @@ void Network::startEthernet() {
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
// a locally-administered address from base+1 instead of the universal base+3 that Arduino Core 2 used.
+7 -21
View File
@@ -867,7 +867,7 @@ bool System::loop() {
void System::send_info_mqtt() {
static uint8_t _connection = 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
if (!Mqtt::connected() || connection == _connection) {
return;
@@ -1092,6 +1092,7 @@ void System::show_system(uuid::console::Shell & shell) {
shell.println();
shell.println("System:");
shell.printfln(" Version: %s", EMSESP_APP_VERSION);
shell.printfln(" System name: %s", system_name_.c_str());
#ifndef EMSESP_STANDALONE
shell.printfln(" Platform: %s (%s)", EMSESP_PLATFORM, ESP.getChipModel());
shell.printfln(" Model: %s", getBBQKeesGatewayDetails().c_str());
@@ -1978,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) {
LOG_INFO("System command '%s' with value '%s'", cmd, value);
}
@@ -2822,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
// 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};
} 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") {
#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
@@ -2914,7 +2900,7 @@ bool System::command_txpause(const char * value, const int8_t) {
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) {
if (EMSESP::system_.disable_reset()) {
LOG_NOTICE("Factory reset disabled");
@@ -2924,7 +2910,7 @@ bool System::command_format(const char * value, const int8_t id) {
#if !defined(EMSESP_STANDALONE) && !defined(EMSESP_TEST)
// don't really format the filesystem in test or standalone mode
if (LittleFS.format()) {
LOG_INFO("Filesystem formatted successfully. All config files removed.");
LOG_INFO("Filesystem formatted successfully. All settings files removed.");
} else {
LOG_ERROR("Format failed");
}
+5 -5
View File
@@ -935,7 +935,7 @@ bool Solar::set_heatTransferSystem(const char * value, const int8_t id) {
if (!Helpers::value2bool(value, b)) {
return false;
}
write_command(0x358, 5, b ? 0x01 : 0x00, 0x358);
write_command(0x358, 5, b ? 0xFF : 0x00); // change is broadcasted
return true;
}
@@ -945,7 +945,7 @@ bool Solar::set_externalCyl(const char * value, const int8_t id) {
if (!Helpers::value2bool(value, b)) {
return false;
}
write_command(0x358, 9, b ? 0x01 : 0x00, 0x358);
write_command(0x358, 9, b ? 0xFF : 0x00); // change is broadcasted
return true;
}
@@ -955,7 +955,7 @@ bool Solar::set_thermalDisinfect(const char * value, const int8_t id) {
if (!Helpers::value2bool(value, b)) {
return false;
}
write_command(0x358, 10, b ? 0x01 : 0x00, 0x358);
write_command(0x358, 10, b ? 0xFF : 0x00); // change is broadcasted
return true;
}
@@ -965,7 +965,7 @@ bool Solar::set_heatMetering(const char * value, const int8_t id) {
if (!Helpers::value2bool(value, b)) {
return false;
}
write_command(0x358, 14, b ? 0x01 : 0x00, 0x358);
write_command(0x358, 14, b ? 0xFF : 0x00); // change is broadcasted
return true;
}
@@ -978,7 +978,7 @@ bool Solar::set_solarEnabled(const char * value, const int8_t id) {
if (flags() == EMSdevice::EMS_DEVICE_FLAG_SM10) {
write_command(0x96, 0, b ? 0xFF : 0x00, 0x96);
} else {
write_command(0x358, 19, b ? 0x01 : 0x00, 0x358);
write_command(0x358, 19, b ? 0xFF : 0x00); // change is broadcasted
}
return true;
}
+1 -1
View File
@@ -1 +1 @@
#define EMSESP_APP_VERSION "3.9.0-dev.7"
#define EMSESP_APP_VERSION "3.9.0-dev.8"