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) - option to disable factory reset [#3150](https://github.com/emsesp/EMS-ESP32/issues/3150)
- TLS support with 4MB boards without PSRAM - TLS support with 4MB boards without PSRAM
- added eth_10mbit to Network Settings, which forces 10BASE-T half-duplex & autonegotiation off, halving the 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) - 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 ## 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 - "IPv4 nameserver" showed an IPv6 address when IPv6 was in use
- HA Discovery warning on Uptime after EMS-ESP boot due to NTP not ready - HA Discovery warning on Uptime after EMS-ESP boot due to NTP not ready
- hc/control setting for UI800 thermostats [#3181](https://github.com/emsesp/EMS-ESP32/discussions/3181) - hc/control setting for UI800 thermostats [#3181](https://github.com/emsesp/EMS-ESP32/discussions/3181)
- solar module switches [#3223](https://github.com/emsesp/EMS-ESP32/issues/3223)
## Changed ## Changed
+1 -1
View File
@@ -113,7 +113,7 @@ CPPFLAGS += $(DEFINES) $(DEFAULTS) $(INCLUDE)
CPPFLAGS += -ggdb -g3 -MMD CPPFLAGS += -ggdb -g3 -MMD
CPPFLAGS += -flto=auto CPPFLAGS += -flto=auto
CPPFLAGS += -Wall -Wextra -Werror CPPFLAGS += -Wall -Wextra -Werror
CPPFLAGS += -Wno-unused-parameter -Wno-missing-braces -Wno-vla-cxx-extension -Wno-switch-enum -Wno-unused-lambda-capture CPPFLAGS += -Wno-unused-parameter -Wno-missing-braces -Wno-vla-cxx-extension -Wno-switch-enum
CPPFLAGS += -ffunction-sections -fdata-sections -fno-exceptions -fno-rtti -fno-threadsafe-statics CPPFLAGS += -ffunction-sections -fdata-sections -fno-exceptions -fno-rtti -fno-threadsafe-statics
CPPFLAGS += -Os -DNDEBUG CPPFLAGS += -Os -DNDEBUG
+27 -27
View File
@@ -317,7 +317,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -477,7 +477,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -637,7 +637,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -797,7 +797,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -957,7 +957,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -1117,7 +1117,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -1277,7 +1277,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -1437,7 +1437,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -1597,7 +1597,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -1757,7 +1757,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -1917,7 +1917,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -2077,7 +2077,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -2237,7 +2237,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -2397,7 +2397,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -2557,7 +2557,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -2717,7 +2717,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -2877,7 +2877,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -3037,7 +3037,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -3197,7 +3197,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -3357,7 +3357,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -4067,7 +4067,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -4227,7 +4227,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -4387,7 +4387,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -4547,7 +4547,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -4707,7 +4707,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -4867,7 +4867,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 int8
@@ -5155,7 +5155,7 @@ uint8
uint8 uint8
| burnminperiod | burner min period | uint8 (&gt;=0&lt;=120) | minutes | true | DEVICE_DATA | 262 | 1 | 1 | | 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 | | absburnpow | burner current power (absolute) | uint8 | % | false | DEVICE_DATA | 263 | 1 | 1 |
| heatblock | heating block | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 | | heatblock | Heatblock temperature | uint16 | C | false | DEVICE_DATA | 264 | 1 | 1/10 |
int8 int8
| boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 | | boilhyston | hysteresis on temperature | int8 (&gt;=-20&lt;=0) | C | true | DEVICE_DATA | 265 | 1 | 1 |
int8 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,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"Greenstar 2000",boiler,11,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "Greenstar 2000",boiler,11,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"Greenstar 2000",boiler,11,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "Greenstar 2000",boiler,11,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"Greenstar 2000",boiler,11,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "Greenstar 2000",boiler,11,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"Greenstar 2000",boiler,11,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "Greenstar 2000",boiler,11,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"Greenstar 2000",boiler,11,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "Greenstar 2000",boiler,11,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"Greenstar 2000",boiler,11,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "Greenstar 2000",boiler,11,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -362,7 +362,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"C1200W",boiler,12,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "C1200W",boiler,12,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"C1200W",boiler,12,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "C1200W",boiler,12,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"C1200W",boiler,12,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "C1200W",boiler,12,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"C1200W",boiler,12,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "C1200W",boiler,12,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"C1200W",boiler,12,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "C1200W",boiler,12,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"C1200W",boiler,12,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "C1200W",boiler,12,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"C1200W",boiler,12,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "C1200W",boiler,12,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -482,7 +482,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"CS5800iG",boiler,16,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "CS5800iG",boiler,16,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"CS5800iG",boiler,16,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "CS5800iG",boiler,16,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"CS5800iG",boiler,16,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "CS5800iG",boiler,16,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"CS5800iG",boiler,16,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "CS5800iG",boiler,16,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"CS5800iG",boiler,16,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "CS5800iG",boiler,16,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"CS5800iG",boiler,16,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "CS5800iG",boiler,16,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"CS5800iG",boiler,16,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "CS5800iG",boiler,16,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -602,7 +602,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"BK13/BK15, Smartline, GB1*2",boiler,64,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "BK13/BK15, Smartline, GB1*2",boiler,64,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"BK13/BK15, Smartline, GB1*2",boiler,64,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "BK13/BK15, Smartline, GB1*2",boiler,64,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"BK13/BK15, Smartline, GB1*2",boiler,64,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "BK13/BK15, Smartline, GB1*2",boiler,64,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"BK13/BK15, Smartline, GB1*2",boiler,64,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "BK13/BK15, Smartline, GB1*2",boiler,64,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"BK13/BK15, Smartline, GB1*2",boiler,64,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "BK13/BK15, Smartline, GB1*2",boiler,64,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"BK13/BK15, Smartline, GB1*2",boiler,64,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "BK13/BK15, Smartline, GB1*2",boiler,64,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"BK13/BK15, Smartline, GB1*2",boiler,64,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "BK13/BK15, Smartline, GB1*2",boiler,64,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -722,7 +722,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"Logano GB1*5, Logamatic MC10",boiler,72,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "Logano GB1*5, Logamatic MC10",boiler,72,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"Logano GB1*5, Logamatic MC10",boiler,72,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "Logano GB1*5, Logamatic MC10",boiler,72,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"Logano GB1*5, Logamatic MC10",boiler,72,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "Logano GB1*5, Logamatic MC10",boiler,72,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"Logano GB1*5, Logamatic MC10",boiler,72,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "Logano GB1*5, Logamatic MC10",boiler,72,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"Logano GB1*5, Logamatic MC10",boiler,72,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "Logano GB1*5, Logamatic MC10",boiler,72,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"Logano GB1*5, Logamatic MC10",boiler,72,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "Logano GB1*5, Logamatic MC10",boiler,72,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"Logano GB1*5, Logamatic MC10",boiler,72,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "Logano GB1*5, Logamatic MC10",boiler,72,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -842,7 +842,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"Cascade CM10",boiler,81,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "Cascade CM10",boiler,81,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"Cascade CM10",boiler,81,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "Cascade CM10",boiler,81,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"Cascade CM10",boiler,81,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "Cascade CM10",boiler,81,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"Cascade CM10",boiler,81,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "Cascade CM10",boiler,81,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"Cascade CM10",boiler,81,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "Cascade CM10",boiler,81,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"Cascade CM10",boiler,81,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "Cascade CM10",boiler,81,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"Cascade CM10",boiler,81,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "Cascade CM10",boiler,81,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -962,7 +962,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"Logamax Plus GB022",boiler,84,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "Logamax Plus GB022",boiler,84,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"Logamax Plus GB022",boiler,84,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "Logamax Plus GB022",boiler,84,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"Logamax Plus GB022",boiler,84,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "Logamax Plus GB022",boiler,84,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"Logamax Plus GB022",boiler,84,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "Logamax Plus GB022",boiler,84,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"Logamax Plus GB022",boiler,84,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "Logamax Plus GB022",boiler,84,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"Logamax Plus GB022",boiler,84,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "Logamax Plus GB022",boiler,84,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"Logamax Plus GB022",boiler,84,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "Logamax Plus GB022",boiler,84,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -1082,7 +1082,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -1202,7 +1202,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"Topline, GB162",boiler,115,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "Topline, GB162",boiler,115,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"Topline, GB162",boiler,115,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "Topline, GB162",boiler,115,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"Topline, GB162",boiler,115,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "Topline, GB162",boiler,115,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"Topline, GB162",boiler,115,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "Topline, GB162",boiler,115,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"Topline, GB162",boiler,115,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "Topline, GB162",boiler,115,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"Topline, GB162",boiler,115,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "Topline, GB162",boiler,115,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"Topline, GB162",boiler,115,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "Topline, GB162",boiler,115,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -1322,7 +1322,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"Cascade MCM10",boiler,121,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "Cascade MCM10",boiler,121,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"Cascade MCM10",boiler,121,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "Cascade MCM10",boiler,121,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"Cascade MCM10",boiler,121,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "Cascade MCM10",boiler,121,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"Cascade MCM10",boiler,121,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "Cascade MCM10",boiler,121,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"Cascade MCM10",boiler,121,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "Cascade MCM10",boiler,121,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"Cascade MCM10",boiler,121,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "Cascade MCM10",boiler,121,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"Cascade MCM10",boiler,121,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "Cascade MCM10",boiler,121,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -1442,7 +1442,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"Proline",boiler,122,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "Proline",boiler,122,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"Proline",boiler,122,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "Proline",boiler,122,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"Proline",boiler,122,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "Proline",boiler,122,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"Proline",boiler,122,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "Proline",boiler,122,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"Proline",boiler,122,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "Proline",boiler,122,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"Proline",boiler,122,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "Proline",boiler,122,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"Proline",boiler,122,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "Proline",boiler,122,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -1562,7 +1562,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -1682,7 +1682,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"GB212",boiler,131,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "GB212",boiler,131,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"GB212",boiler,131,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "GB212",boiler,131,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"GB212",boiler,131,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "GB212",boiler,131,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"GB212",boiler,131,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "GB212",boiler,131,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"GB212",boiler,131,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "GB212",boiler,131,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"GB212",boiler,131,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "GB212",boiler,131,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"GB212",boiler,131,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "GB212",boiler,131,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -1802,7 +1802,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"GC7000F",boiler,132,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "GC7000F",boiler,132,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"GC7000F",boiler,132,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "GC7000F",boiler,132,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"GC7000F",boiler,132,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "GC7000F",boiler,132,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"GC7000F",boiler,132,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "GC7000F",boiler,132,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"GC7000F",boiler,132,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "GC7000F",boiler,132,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"GC7000F",boiler,132,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "GC7000F",boiler,132,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"GC7000F",boiler,132,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "GC7000F",boiler,132,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -1922,7 +1922,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"Logano GB125/KB195i, Logamatic MC110",boiler,133,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "Logano GB125/KB195i, Logamatic MC110",boiler,133,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"Logano GB125/KB195i, Logamatic MC110",boiler,133,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "Logano GB125/KB195i, Logamatic MC110",boiler,133,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"Logano GB125/KB195i, Logamatic MC110",boiler,133,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "Logano GB125/KB195i, Logamatic MC110",boiler,133,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"Logano GB125/KB195i, Logamatic MC110",boiler,133,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "Logano GB125/KB195i, Logamatic MC110",boiler,133,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"Logano GB125/KB195i, Logamatic MC110",boiler,133,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "Logano GB125/KB195i, Logamatic MC110",boiler,133,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"Logano GB125/KB195i, Logamatic MC110",boiler,133,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "Logano GB125/KB195i, Logamatic MC110",boiler,133,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"Logano GB125/KB195i, Logamatic MC110",boiler,133,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "Logano GB125/KB195i, Logamatic MC110",boiler,133,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -2042,7 +2042,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"Greenstar 30Ri Compact",boiler,154,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "Greenstar 30Ri Compact",boiler,154,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"Greenstar 30Ri Compact",boiler,154,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "Greenstar 30Ri Compact",boiler,154,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"Greenstar 30Ri Compact",boiler,154,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "Greenstar 30Ri Compact",boiler,154,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"Greenstar 30Ri Compact",boiler,154,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "Greenstar 30Ri Compact",boiler,154,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"Greenstar 30Ri Compact",boiler,154,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "Greenstar 30Ri Compact",boiler,154,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"Greenstar 30Ri Compact",boiler,154,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "Greenstar 30Ri Compact",boiler,154,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"Greenstar 30Ri Compact",boiler,154,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "Greenstar 30Ri Compact",boiler,154,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -2162,7 +2162,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"Suprapur-o",boiler,155,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "Suprapur-o",boiler,155,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"Suprapur-o",boiler,155,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "Suprapur-o",boiler,155,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"Suprapur-o",boiler,155,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "Suprapur-o",boiler,155,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"Suprapur-o",boiler,155,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "Suprapur-o",boiler,155,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"Suprapur-o",boiler,155,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "Suprapur-o",boiler,155,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"Suprapur-o",boiler,155,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "Suprapur-o",boiler,155,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"Suprapur-o",boiler,155,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "Suprapur-o",boiler,155,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -2282,7 +2282,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"Cerapur Aero",boiler,167,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "Cerapur Aero",boiler,167,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"Cerapur Aero",boiler,167,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "Cerapur Aero",boiler,167,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"Cerapur Aero",boiler,167,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "Cerapur Aero",boiler,167,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"Cerapur Aero",boiler,167,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "Cerapur Aero",boiler,167,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"Cerapur Aero",boiler,167,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "Cerapur Aero",boiler,167,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"Cerapur Aero",boiler,167,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "Cerapur Aero",boiler,167,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"Cerapur Aero",boiler,167,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "Cerapur Aero",boiler,167,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -2402,7 +2402,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"Hybrid Heatpump",boiler,168,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "Hybrid Heatpump",boiler,168,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"Hybrid Heatpump",boiler,168,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "Hybrid Heatpump",boiler,168,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"Hybrid Heatpump",boiler,168,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "Hybrid Heatpump",boiler,168,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"Hybrid Heatpump",boiler,168,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "Hybrid Heatpump",boiler,168,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"Hybrid Heatpump",boiler,168,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "Hybrid Heatpump",boiler,168,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"Hybrid Heatpump",boiler,168,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "Hybrid Heatpump",boiler,168,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"Hybrid Heatpump",boiler,168,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "Hybrid Heatpump",boiler,168,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -2522,7 +2522,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"Logano GB212",boiler,170,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "Logano GB212",boiler,170,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"Logano GB212",boiler,170,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "Logano GB212",boiler,170,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"Logano GB212",boiler,170,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "Logano GB212",boiler,170,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"Logano GB212",boiler,170,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "Logano GB212",boiler,170,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"Logano GB212",boiler,170,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "Logano GB212",boiler,170,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"Logano GB212",boiler,170,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "Logano GB212",boiler,170,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"Logano GB212",boiler,170,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "Logano GB212",boiler,170,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -3078,7 +3078,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -3198,7 +3198,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"Logamax U122, Cerapur",boiler,203,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "Logamax U122, Cerapur",boiler,203,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"Logamax U122, Cerapur",boiler,203,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "Logamax U122, Cerapur",boiler,203,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"Logamax U122, Cerapur",boiler,203,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "Logamax U122, Cerapur",boiler,203,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"Logamax U122, Cerapur",boiler,203,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "Logamax U122, Cerapur",boiler,203,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"Logamax U122, Cerapur",boiler,203,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "Logamax U122, Cerapur",boiler,203,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"Logamax U122, Cerapur",boiler,203,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "Logamax U122, Cerapur",boiler,203,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"Logamax U122, Cerapur",boiler,203,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "Logamax U122, Cerapur",boiler,203,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -3318,7 +3318,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"Ecomline Excellent",boiler,206,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "Ecomline Excellent",boiler,206,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"Ecomline Excellent",boiler,206,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "Ecomline Excellent",boiler,206,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"Ecomline Excellent",boiler,206,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "Ecomline Excellent",boiler,206,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"Ecomline Excellent",boiler,206,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "Ecomline Excellent",boiler,206,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"Ecomline Excellent",boiler,206,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "Ecomline Excellent",boiler,206,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"Ecomline Excellent",boiler,206,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "Ecomline Excellent",boiler,206,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"Ecomline Excellent",boiler,206,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "Ecomline Excellent",boiler,206,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -3438,7 +3438,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -3558,7 +3558,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"Cascade MC400",boiler,210,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "Cascade MC400",boiler,210,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"Cascade MC400",boiler,210,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "Cascade MC400",boiler,210,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"Cascade MC400",boiler,210,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "Cascade MC400",boiler,210,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"Cascade MC400",boiler,210,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "Cascade MC400",boiler,210,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"Cascade MC400",boiler,210,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "Cascade MC400",boiler,210,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"Cascade MC400",boiler,210,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "Cascade MC400",boiler,210,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"Cascade MC400",boiler,210,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "Cascade MC400",boiler,210,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -3678,7 +3678,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"EasyControl Adapter",boiler,211,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "EasyControl Adapter",boiler,211,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"EasyControl Adapter",boiler,211,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "EasyControl Adapter",boiler,211,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"EasyControl Adapter",boiler,211,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "EasyControl Adapter",boiler,211,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"EasyControl Adapter",boiler,211,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "EasyControl Adapter",boiler,211,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"EasyControl Adapter",boiler,211,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "EasyControl Adapter",boiler,211,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"EasyControl Adapter",boiler,211,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "EasyControl Adapter",boiler,211,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"EasyControl Adapter",boiler,211,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "EasyControl Adapter",boiler,211,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
@@ -3898,7 +3898,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1 "Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,6,0,1,261,1
"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1 "Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,6,0,1,262,1
"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1 "Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,absburnpow,burner current power (absolute),uint8,%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,6,0,1,263,1
"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,heatblock,heating block,uint16,C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,6,0,1/10,264,1 "Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,heatblock,Heatblock temperature,uint16,C,false,sensor.boiler_Heatblock_temperature,sensor.boiler_heatblock,6,0,1/10,264,1
"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1 "Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,6,0,1,265,1
"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1 "Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,6,0,1,266,1
"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1 "Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,6,0,1,267,1
Can't render this file because it is too large.
+5 -5
View File
@@ -42,11 +42,11 @@
"@eslint/js": "^10.0.1", "@eslint/js": "^10.0.1",
"@preact/preset-vite": "^2.10.6", "@preact/preset-vite": "^2.10.6",
"@trivago/prettier-plugin-sort-imports": "^6.0.2", "@trivago/prettier-plugin-sort-imports": "^6.0.2",
"@types/node": "^26.4.1", "@types/node": "^26.5.0",
"@types/react": "^19.2.18", "@types/react": "^19.2.18",
"@types/react-dom": "^19.2.5", "@types/react-dom": "^19.2.7",
"concurrently": "^10.0.5", "concurrently": "^10.0.5",
"eslint": "^10.9.1", "eslint": "^10.10.0",
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.8",
"etag": "^1.8.1", "etag": "^1.8.1",
"mime-types": "^3.0.2", "mime-types": "^3.0.2",
@@ -54,9 +54,9 @@
"rollup-plugin-visualizer": "^7.1.1", "rollup-plugin-visualizer": "^7.1.1",
"terser": "^5.51.2", "terser": "^5.51.2",
"typescript": "^6.0.3", "typescript": "^6.0.3",
"typescript-eslint": "^8.69.0", "typescript-eslint": "^8.70.0",
"vite": "^8.2.2", "vite": "^8.2.2",
"vite-plugin-imagemin": "^0.6.1" "vite-plugin-imagemin": "^0.6.1"
}, },
"packageManager": "pnpm@11.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(); const formData = new FormData();
formData.append('file', file); formData.append('file', file);
return alovaInstance.Post('/rest/uploadFile', formData, { return alovaInstance.Post('/rest/uploadFile', formData, {
timeout: UPLOAD_TIMEOUT timeout: UPLOAD_TIMEOUT,
enableUpload: true
}); });
}; };
+1
View File
@@ -307,6 +307,7 @@ export const BOARD_PROFILES = {
LOLIN: 'Lolin D32', LOLIN: 'Lolin D32',
OLIMEX: 'Olimex ESP32-EVB', OLIMEX: 'Olimex ESP32-EVB',
OLIMEXPOE: 'Olimex ESP32-POE', OLIMEXPOE: 'Olimex ESP32-POE',
OLIMEXPOEW: 'Olimex ESP32-POE-ISO WROVER (PSRAM)',
C3MINI: 'Wemos C3 Mini', C3MINI: 'Wemos C3 Mini',
S2MINI: 'Wemos S2 Mini', S2MINI: 'Wemos S2 Mini',
S3MINI: 'Liligo S3' S3MINI: 'Liligo S3'
@@ -165,11 +165,7 @@ const DownloadUpload = () => {
{LL.UPLOAD()} {LL.UPLOAD()}
</Typography> </Typography>
<Typography sx={{ pb: 2 }} color="warning" variant="body1"> <SingleUpload text={LL.UPLOAD_BACKUP_TEXT()} doRestart={doRestart} />
{LL.UPLOAD_TEXT()}:
</Typography>
<SingleUpload doRestart={doRestart} />
</SectionContent> </SectionContent>
); );
}; };
+1 -1
View File
@@ -846,7 +846,7 @@ const Version = () => {
<Typography sx={{ pt: 2, pb: 2 }} variant="h6" color="primary"> <Typography sx={{ pt: 2, pb: 2 }} variant="h6" color="primary">
{LL.UPLOAD()} {LL.UPLOAD()}
</Typography> </Typography>
<SingleUpload doRestart={doRestart} /> <SingleUpload text={LL.UPLOAD_FIRMWARE_TEXT()} doRestart={doRestart} />
</> </>
)} )}
</Box> </Box>
+1 -1
View File
@@ -369,7 +369,7 @@ const SystemLog = () => {
) : ( ) : (
<> <>
{data.developer_mode && ( {data.developer_mode && (
<IconButton onClick={sendReadCommand} aria-label={LL.EXECUTE()}> <IconButton onClick={sendReadCommand} aria-label={LL.RUN()}>
<PlayArrowIcon color="primary" /> <PlayArrowIcon color="primary" />
</IconButton> </IconButton>
)} )}
@@ -14,9 +14,10 @@ import { LinearProgressWithLabel } from './LinearProgressWithLabel';
interface SingleUploadProps { interface SingleUploadProps {
doRestart: () => void; doRestart: () => void;
text: string;
} }
const SingleUpload = ({ doRestart }: SingleUploadProps) => { const SingleUpload = ({ doRestart, text }: SingleUploadProps) => {
const [md5, setMd5] = useState<string>(); const [md5, setMd5] = useState<string>();
const [file, setFile] = useState<File>(); const [file, setFile] = useState<File>();
const { LL } = useI18nContext(); const { LL } = useI18nContext();
@@ -29,11 +30,22 @@ const SingleUpload = ({ doRestart }: SingleUploadProps) => {
} = useRequest(SystemApi.uploadFile, { } = useRequest(SystemApi.uploadFile, {
immediate: false immediate: false
}).onSuccess(({ data }) => { }).onSuccess(({ data }) => {
if (data && typeof data === 'object' && 'md5' in data) { let payload = data;
setMd5((data as { md5: string }).md5); if (typeof payload === 'string' && payload.length > 0) {
toast.success(LL.UPLOAD() + ' MD5 ' + LL.SUCCESSFUL()); try {
payload = JSON.parse(payload);
} catch {
payload = data;
}
}
if (payload && typeof payload === 'object' && 'md5' in payload) {
setMd5((payload as { md5: string }).md5);
toast.success(LL.UPLOAD_MD5_RECEIVED());
setFile(undefined); setFile(undefined);
} else { } else {
if (payload && typeof payload === 'object' && 'md5_ok' in payload) {
toast.success(LL.UPLOAD_MD5_MATCHED());
}
doRestart(); doRestart();
} }
}); });
@@ -80,12 +92,17 @@ const SingleUpload = ({ doRestart }: SingleUploadProps) => {
</Button> </Button>
</> </>
) : ( ) : (
<DragNdrop text={LL.UPLOAD_DROP_TEXT()} onFileSelected={setFile} /> <DragNdrop
text={(md5 ? LL.UPLOAD_MD5_RECEIVED() : text) + '...'}
onFileSelected={setFile}
/>
)} )}
{md5 && ( {md5 && (
<Box sx={{ mt: 2 }}> <Box sx={{ mt: 2 }}>
<Typography variant="body2">{'MD5: ' + md5}</Typography> <Typography variant="body2" color="success">
{'MD5: ' + md5}
</Typography>
</Box> </Box>
)} )}
</> </>
+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_TEXT: 'Vytvořte zálohu svého nastavení a konfigurace',
DOWNLOAD_SETTINGS_TEXT2: 'Exportovat všechny hodnoty', DOWNLOAD_SETTINGS_TEXT2: 'Exportovat všechny hodnoty',
DOWNLOAD_SYSTEM_BACKUP: 'Systémová záloha', DOWNLOAD_SYSTEM_BACKUP: 'Systémová záloha',
UPLOAD_TEXT: 'Nahrajte nový soubor firmwaru (.bin) nebo záložní soubor (.json)',
UPLOAD_DROP_TEXT: 'Přetáhněte soubor sem nebo klikněte pro výběr',
ERROR: 'Neočekávaná chyba, zkuste to prosím znovu', ERROR: 'Neočekávaná chyba, zkuste to prosím znovu',
TIME_SET: 'Čas nastaven', TIME_SET: 'Čas nastaven',
MANAGE_USERS: 'Spravovat uživatele', MANAGE_USERS: 'Spravovat uživatele',
@@ -349,7 +347,11 @@ const cs: Translation = {
COMMANDS_HELP_1: 'Definujte vlastní příkazy pro magistrali EMS', COMMANDS_HELP_1: 'Definujte vlastní příkazy pro magistrali EMS',
COMMAND_EXECUTED: 'Příkaz úspěšně spuštěn', COMMAND_EXECUTED: 'Příkaz úspěšně spuštěn',
RUN: 'Spustit příkaz', RUN: 'Spustit příkaz',
INTERNET_CONNECTION_CHECK: 'Kontrola online pro dostupné verze' INTERNET_CONNECTION_CHECK: 'Kontrola online pro dostupné verze',
UPLOAD_BACKUP_TEXT: 'Klikněte, abyste vybrali nebo přetáhli a pustili soubor zálohy (.json) sem',
UPLOAD_FIRMWARE_TEXT: 'Klikněte, abyste vybrali nebo přetáhli a pustili soubor firmware .bin/.md5 sem',
UPLOAD_MD5_RECEIVED: 'Digest přijat, nyní nahrajte firmware .bin',
UPLOAD_MD5_MATCHED: 'MD5 souhlasí, firmware se instaluje...'
}; };
export default cs; export default cs;
+5 -3
View File
@@ -178,8 +178,6 @@ const de: Translation = {
DOWNLOAD_SETTINGS_TEXT: 'Erstellen Sie eine Sicherung Ihrer Konfigurationen und Einstellungen', DOWNLOAD_SETTINGS_TEXT: 'Erstellen Sie eine Sicherung Ihrer Konfigurationen und Einstellungen',
DOWNLOAD_SETTINGS_TEXT2: 'Exportiere alle Werte', DOWNLOAD_SETTINGS_TEXT2: 'Exportiere alle Werte',
DOWNLOAD_SYSTEM_BACKUP: 'Systemsicherung', DOWNLOAD_SYSTEM_BACKUP: 'Systemsicherung',
UPLOAD_TEXT: 'Laden Sie eine neue Firmware-Datei (.bin) oder eine Sicherungsdatei (.json) hoch',
UPLOAD_DROP_TEXT: 'Legen Sie eine Firmware-Datei (.bin) ab oder klicken Sie hier',
ERROR: 'Unerwarteter Fehler, bitte versuchen Sie es erneut.', ERROR: 'Unerwarteter Fehler, bitte versuchen Sie es erneut.',
TIME_SET: 'Zeit gesetzt', TIME_SET: 'Zeit gesetzt',
MANAGE_USERS: 'Nutzerverwaltung', MANAGE_USERS: 'Nutzerverwaltung',
@@ -349,7 +347,11 @@ const de: Translation = {
COMMANDS_HELP_1: 'Definieren Sie eigene Befehle für die EMS-Magistral', COMMANDS_HELP_1: 'Definieren Sie eigene Befehle für die EMS-Magistral',
COMMAND_EXECUTED: 'Befehl erfolgreich ausgeführt', COMMAND_EXECUTED: 'Befehl erfolgreich ausgeführt',
RUN: 'Befehl ausführen', RUN: 'Befehl ausführen',
INTERNET_CONNECTION_CHECK: 'Online-Prüfung auf verfügbare Versionen' INTERNET_CONNECTION_CHECK: 'Online-Prüfung auf verfügbare Versionen',
UPLOAD_BACKUP_TEXT: 'Klicken Sie, um eine Sicherungsdatei (.json) auszuwählen oder zu ziehen und abzulegen',
UPLOAD_FIRMWARE_TEXT: 'Klicken Sie, um eine Firmware-Datei (.bin/.md5) auszuwählen oder zu ziehen und abzulegen',
UPLOAD_MD5_RECEIVED: 'Prüfsumme empfangen, jetzt die Firmware-Datei (.bin) hochladen',
UPLOAD_MD5_MATCHED: 'MD5 stimmt überein, Firmware wird installiert...'
}; };
export default de; export default de;
+5 -3
View File
@@ -178,8 +178,6 @@ const en: Translation = {
DOWNLOAD_SETTINGS_TEXT: 'Create a backup of your configuration and settings', DOWNLOAD_SETTINGS_TEXT: 'Create a backup of your configuration and settings',
DOWNLOAD_SETTINGS_TEXT2: 'Export all values', DOWNLOAD_SETTINGS_TEXT2: 'Export all values',
DOWNLOAD_SYSTEM_BACKUP: 'System Backup', DOWNLOAD_SYSTEM_BACKUP: 'System Backup',
UPLOAD_TEXT: 'Upload a new firmware file (.bin) or a backup file (.json)',
UPLOAD_DROP_TEXT: 'Drop a firmware .bin file or click here',
ERROR: 'Unexpected Error, please try again', ERROR: 'Unexpected Error, please try again',
TIME_SET: 'Time set', TIME_SET: 'Time set',
MANAGE_USERS: 'Manage Users', MANAGE_USERS: 'Manage Users',
@@ -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', 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', COMMAND_EXECUTED: 'Command executed successfully',
RUN: 'Run', RUN: 'Run',
INTERNET_CONNECTION_CHECK: 'Checking online for available versions' INTERNET_CONNECTION_CHECK: 'Checking online for available versions',
UPLOAD_BACKUP_TEXT: 'Click to select or Drag&Drop a backup file (.json) here',
UPLOAD_FIRMWARE_TEXT: 'Click to select or Drag&Drop a firmware .bin/.md5 file',
UPLOAD_MD5_RECEIVED: 'Digest received, now upload the firmware .bin file',
UPLOAD_MD5_MATCHED: 'MD5 matches, installing firmware...'
}; };
export default en; export default en;
+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_TEXT: 'Créer une sauvegarde de vos paramètres et configurations',
DOWNLOAD_SETTINGS_TEXT2: 'Exporter toutes les valeurs', DOWNLOAD_SETTINGS_TEXT2: 'Exporter toutes les valeurs',
DOWNLOAD_SYSTEM_BACKUP: 'Sauvegarde système', DOWNLOAD_SYSTEM_BACKUP: 'Sauvegarde système',
UPLOAD_TEXT: 'Télécharger un nouveau fichier firmware (.bin) ou une sauvegarde (.json)',
UPLOAD_DROP_TEXT: 'Drop a firmware .bin file or click here',
ERROR: 'Erreur inattendue, veuillez réessayer', ERROR: 'Erreur inattendue, veuillez réessayer',
TIME_SET: 'Time set', TIME_SET: 'Time set',
MANAGE_USERS: 'Gérer les utilisateurs', MANAGE_USERS: 'Gérer les utilisateurs',
@@ -349,7 +347,11 @@ const fr: Translation = {
COMMANDS_HELP_1: 'Définir des commandes personnalisées pour la magistral EMS', COMMANDS_HELP_1: 'Définir des commandes personnalisées pour la magistral EMS',
COMMAND_EXECUTED: 'Commande exécutée avec succès', COMMAND_EXECUTED: 'Commande exécutée avec succès',
RUN: 'Exécuter une commande', RUN: 'Exécuter une commande',
INTERNET_CONNECTION_CHECK: 'Vérification en ligne pour les versions disponibles' INTERNET_CONNECTION_CHECK: 'Vérification en ligne pour les versions disponibles',
UPLOAD_BACKUP_TEXT: 'Cliquez pour sélectionner ou faites glisser et déposez un fichier de sauvegarde (.json) ici',
UPLOAD_FIRMWARE_TEXT: 'Cliquez pour sélectionner ou faites glisser et déposez un fichier firmware .bin/.md5 ici',
UPLOAD_MD5_RECEIVED: 'Empreinte reçue, téléversez maintenant le fichier firmware .bin',
UPLOAD_MD5_MATCHED: 'MD5 concordant, installation du firmware...'
}; };
export default fr; export default fr;
+5 -3
View File
@@ -178,8 +178,6 @@ const it: Translation = {
DOWNLOAD_SETTINGS_TEXT: 'Create a backup of your configuration and settings', DOWNLOAD_SETTINGS_TEXT: 'Create a backup of your configuration and settings',
DOWNLOAD_SETTINGS_TEXT2: 'Esporta tutti i valori', DOWNLOAD_SETTINGS_TEXT2: 'Esporta tutti i valori',
DOWNLOAD_SYSTEM_BACKUP: 'Backup sistema', DOWNLOAD_SYSTEM_BACKUP: 'Backup sistema',
UPLOAD_TEXT: 'Upload a new firmware file (.bin) or a backup file (.json)',
UPLOAD_DROP_TEXT: 'Drop a firmware .bin file or click here',
ERROR: 'Errore Inaspettato, prego tenta ancora', ERROR: 'Errore Inaspettato, prego tenta ancora',
TIME_SET: 'Imposta Ora', TIME_SET: 'Imposta Ora',
MANAGE_USERS: 'Gestione Utenti', MANAGE_USERS: 'Gestione Utenti',
@@ -349,7 +347,11 @@ const it: Translation = {
COMMANDS_HELP_1: 'Definisci comandi personalizzati per la magistrali EMS', COMMANDS_HELP_1: 'Definisci comandi personalizzati per la magistrali EMS',
COMMAND_EXECUTED: 'Comando eseguito con successo', COMMAND_EXECUTED: 'Comando eseguito con successo',
RUN: 'Esegui comando', RUN: 'Esegui comando',
INTERNET_CONNECTION_CHECK: 'Controllo online per le versioni disponibili' INTERNET_CONNECTION_CHECK: 'Controllo online per le versioni disponibili',
UPLOAD_BACKUP_TEXT: 'Klik per selezionare o trascinare e rilasciare un file di backup (.json) qui',
UPLOAD_FIRMWARE_TEXT: 'Klik per selezionare o trascinare e rilasciare un file firmware .bin/.md5 qui',
UPLOAD_MD5_RECEIVED: 'Digest ricevuto, ora caricare il file firmware .bin',
UPLOAD_MD5_MATCHED: 'MD5 corrispondente, installazione firmware...'
}; };
export default it; export default it;
+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_TEXT: 'Maak een back-up van uw configuratie en instellingen',
DOWNLOAD_SETTINGS_TEXT2: 'Exporteer alle waarden', DOWNLOAD_SETTINGS_TEXT2: 'Exporteer alle waarden',
DOWNLOAD_SYSTEM_BACKUP: 'Systeem Backup', DOWNLOAD_SYSTEM_BACKUP: 'Systeem Backup',
UPLOAD_TEXT: 'Upload een nieuw firmwarebestand (.bin) of een back-upbestand (.json)',
UPLOAD_DROP_TEXT: 'Sleep en firmware .bin bestand hierheen of klik hier',
ERROR: 'Onverwachte fout, probeer opnieuw', ERROR: 'Onverwachte fout, probeer opnieuw',
TIME_SET: 'Tijd ingesteld', TIME_SET: 'Tijd ingesteld',
MANAGE_USERS: 'Gebruikersbeheer', MANAGE_USERS: 'Gebruikersbeheer',
@@ -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', 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', COMMAND_EXECUTED: 'Commando uitgevoerd succesvol',
RUN: 'Commando uitvoeren', RUN: 'Commando uitvoeren',
INTERNET_CONNECTION_CHECK: 'Controleren op online beschikbare versies' INTERNET_CONNECTION_CHECK: 'Controleren op online beschikbare versies',
UPLOAD_BACKUP_TEXT: 'Klik voor selecteren of sleep en drop een back-upbestand (.json) hier',
UPLOAD_FIRMWARE_TEXT: 'Klik voor selecteren of sleep en drop een firmware .bin/.md5 bestand hier',
UPLOAD_MD5_RECEIVED: 'Digest ontvangen, upload nu het firmware .bin-bestand',
UPLOAD_MD5_MATCHED: 'MD5 komt overeen, firmware wordt geïnstalleerd...'
}; };
export default nl; export default nl;
+5 -3
View File
@@ -178,8 +178,6 @@ const no: Translation = {
DOWNLOAD_SETTINGS_TEXT: 'Lag en sikkerhetskopi av dine konfigurasjon og innstillinger', DOWNLOAD_SETTINGS_TEXT: 'Lag en sikkerhetskopi av dine konfigurasjon og innstillinger',
DOWNLOAD_SETTINGS_TEXT2: 'Eksporter alle verdier', DOWNLOAD_SETTINGS_TEXT2: 'Eksporter alle verdier',
DOWNLOAD_SYSTEM_BACKUP: 'System Sikkerhetskopi', DOWNLOAD_SYSTEM_BACKUP: 'System Sikkerhetskopi',
UPLOAD_TEXT: 'Last opp en ny firmware fil (.bin) eller en sikkerhetskopi fil (.json)',
UPLOAD_DROP_TEXT: 'Dropp en firmware fil (.bin) eller klikk her',
ERROR: 'Ukjent feil, prøv igjen', ERROR: 'Ukjent feil, prøv igjen',
TIME_SET: 'Still in tid', TIME_SET: 'Still in tid',
MANAGE_USERS: 'Administrer Brukere', MANAGE_USERS: 'Administrer Brukere',
@@ -349,7 +347,11 @@ const no: Translation = {
COMMANDS_HELP_1: 'Definer egne kommandoer for EMS-Magistral', COMMANDS_HELP_1: 'Definer egne kommandoer for EMS-Magistral',
COMMAND_EXECUTED: 'Kommando kjørt lykkes', COMMAND_EXECUTED: 'Kommando kjørt lykkes',
RUN: 'Kjør', RUN: 'Kjør',
INTERNET_CONNECTION_CHECK: 'Kontrollerer online for tilgjengelige versjoner' INTERNET_CONNECTION_CHECK: 'Kontrollerer online for tilgjengelige versjoner',
UPLOAD_BACKUP_TEXT: 'Klikk for å velge eller dra og slipp en sikkerhetskopi (.json) her',
UPLOAD_FIRMWARE_TEXT: 'Klikk for å velge eller dra og slipp en firmware .bin/.md5 her',
UPLOAD_MD5_RECEIVED: 'MD5 mottatt, last nå opp firmware .bin-filen',
UPLOAD_MD5_MATCHED: 'MD5 stemmer, firmware installeres...'
}; };
export default no; export default no;
+5 -3
View File
@@ -178,8 +178,6 @@ const pl: BaseTranslation = {
DOWNLOAD_SETTINGS_TEXT: 'Utwórz kopię swoich ustawień i konfiguracji', DOWNLOAD_SETTINGS_TEXT: 'Utwórz kopię swoich ustawień i konfiguracji',
DOWNLOAD_SETTINGS_TEXT2: 'Eksportuj wszystkie wartości', DOWNLOAD_SETTINGS_TEXT2: 'Eksportuj wszystkie wartości',
DOWNLOAD_SYSTEM_BACKUP: 'Kopia zapasowa systemu', DOWNLOAD_SYSTEM_BACKUP: 'Kopia zapasowa systemu',
UPLOAD_TEXT: 'Wgraj nowy plik firmware (.bin) lub kopię ustawień (.json)',
UPLOAD_DROP_TEXT: 'Upuść plik firmware .bin lub kliknij tutaj',
ERROR: 'Nieoczekiwany błąd, spróbuj ponownie!', ERROR: 'Nieoczekiwany błąd, spróbuj ponownie!',
TIME_SET: 'Zegar został ustawiony.', TIME_SET: 'Zegar został ustawiony.',
MANAGE_USERS: 'Zarządzanie użytkownikami', MANAGE_USERS: 'Zarządzanie użytkownikami',
@@ -349,7 +347,11 @@ const pl: BaseTranslation = {
COMMANDS_HELP_1: 'Zdefiniuj niestandardowe komendy dla magistrali EMS', COMMANDS_HELP_1: 'Zdefiniuj niestandardowe komendy dla magistrali EMS',
COMMAND_EXECUTED: 'Komenda wykonana pomyślnie', COMMAND_EXECUTED: 'Komenda wykonana pomyślnie',
RUN: 'Wykonaj', RUN: 'Wykonaj',
INTERNET_CONNECTION_CHECK: 'Sprawdzanie online dla dostępnych wersji' INTERNET_CONNECTION_CHECK: 'Sprawdzanie online dla dostępnych wersji',
UPLOAD_BACKUP_TEXT: 'Kliknij, aby wybrać lub przeciągnij i upuść plik kopii zapasowej (.json) tutaj',
UPLOAD_FIRMWARE_TEXT: 'Kliknij, aby wybrać lub przeciągnij i upuść plik firmware .bin/.md5',
UPLOAD_MD5_RECEIVED: 'Suma MD5 odebrana, teraz wgraj plik firmware .bin',
UPLOAD_MD5_MATCHED: 'MD5 zgodne, instalowanie firmware...'
}; };
export default pl; export default pl;
+5 -3
View File
@@ -178,8 +178,6 @@ const sk: Translation = {
DOWNLOAD_SETTINGS_TEXT: 'Vytvorte zálohu svojej konfigurácie a nastavení', DOWNLOAD_SETTINGS_TEXT: 'Vytvorte zálohu svojej konfigurácie a nastavení',
DOWNLOAD_SETTINGS_TEXT2: 'Exportovať všetky hodnoty', DOWNLOAD_SETTINGS_TEXT2: 'Exportovať všetky hodnoty',
DOWNLOAD_SYSTEM_BACKUP: 'Systémová záloha', DOWNLOAD_SYSTEM_BACKUP: 'Systémová záloha',
UPLOAD_TEXT: 'Nahrajte nový súbor firmvéru (.bin) alebo súbor zálohy (.json)',
UPLOAD_DROP_TEXT: 'Presuňte súbor .bin firmvéru alebo kliknite sem',
ERROR: 'Neočakávaná chyba, prosím skúste to znova', ERROR: 'Neočakávaná chyba, prosím skúste to znova',
TIME_SET: 'Nastavený čas', TIME_SET: 'Nastavený čas',
MANAGE_USERS: 'Správa používateľov', MANAGE_USERS: 'Správa používateľov',
@@ -349,7 +347,11 @@ const sk: Translation = {
COMMANDS_HELP_1: 'Definujte vlastné príkazy pre magistrali EMS', COMMANDS_HELP_1: 'Definujte vlastné príkazy pre magistrali EMS',
COMMAND_EXECUTED: 'Príkaz vykonaný úspešne', COMMAND_EXECUTED: 'Príkaz vykonaný úspešne',
RUN: 'Volať príkaz', RUN: 'Volať príkaz',
INTERNET_CONNECTION_CHECK: 'Kontrola online pre dostupné verzie' INTERNET_CONNECTION_CHECK: 'Kontrola online pre dostupné verzie',
UPLOAD_BACKUP_TEXT: 'Kliknite, aby ste vybrali alebo presuňte a upustili súbor zálohy (.json) sem',
UPLOAD_FIRMWARE_TEXT: 'Kliknite, aby ste vybrali alebo presuňte a upustili súbor firmware .bin/.md5',
UPLOAD_MD5_RECEIVED: 'Suma MD5 prijatá, teraz nahrajte firmware .bin',
UPLOAD_MD5_MATCHED: 'MD5 súhlasí, firmvér sa inštaluje...'
}; };
export default sk; export default sk;
+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_TEXT: 'Skapa en säkerhetskopia av din konfiguration och inställningar',
DOWNLOAD_SETTINGS_TEXT2: 'Exportera alla värden', DOWNLOAD_SETTINGS_TEXT2: 'Exportera alla värden',
DOWNLOAD_SYSTEM_BACKUP: 'System säkerhetskopia', DOWNLOAD_SYSTEM_BACKUP: 'System säkerhetskopia',
UPLOAD_TEXT: 'Ladda upp en ny firmwarefil (.bin) eller en säkerhetskopiafil (.json)',
UPLOAD_DROP_TEXT: 'Droppa en firmware .bin fil eller klicka här',
ERROR: 'Okänt fel, var god försök igen', ERROR: 'Okänt fel, var god försök igen',
TIME_SET: 'Ställ in tid', TIME_SET: 'Ställ in tid',
MANAGE_USERS: 'Användare', MANAGE_USERS: 'Användare',
@@ -349,7 +347,11 @@ const sv: Translation = {
COMMANDS_HELP_1: 'Definiera egna kommandon för EMS-Magistral', COMMANDS_HELP_1: 'Definiera egna kommandon för EMS-Magistral',
COMMAND_EXECUTED: 'Kommando kört lyckades', COMMAND_EXECUTED: 'Kommando kört lyckades',
RUN: 'Kör kommando', RUN: 'Kör kommando',
INTERNET_CONNECTION_CHECK: 'Kontrollerar online för tillgängliga versioner' INTERNET_CONNECTION_CHECK: 'Kontrollerar online för tillgängliga versioner',
UPLOAD_BACKUP_TEXT: 'Klicka för att välja eller dra och släpp en säkerhetskopia (.json) här',
UPLOAD_FIRMWARE_TEXT: 'Klicka för att välja eller dra och släpp en firmware .bin/.md5 här',
UPLOAD_MD5_RECEIVED: 'MD5 mottagen, ladda nu upp firmware .bin-filen',
UPLOAD_MD5_MATCHED: 'MD5 stämmer, firmware installeras...'
}; };
export default sv; export default sv;
+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_TEXT: 'Yapılandırma ve ayarlarınızın yedekleme yapın',
DOWNLOAD_SETTINGS_TEXT2: 'Tüm değerleri dışarı al', DOWNLOAD_SETTINGS_TEXT2: 'Tüm değerleri dışarı al',
DOWNLOAD_SYSTEM_BACKUP: 'Sistem yedekleme', DOWNLOAD_SYSTEM_BACKUP: 'Sistem yedekleme',
UPLOAD_TEXT: 'Yeni bir firmware dosyası (.bin) veya yedek dosyası (.json) yükle',
UPLOAD_DROP_TEXT: 'Bir firmware .bin dosyası veya buraya tıklayın',
ERROR: 'Beklenemedik hata, lütfen tekrar deneyin.', ERROR: 'Beklenemedik hata, lütfen tekrar deneyin.',
TIME_SET: 'Zaman ayarı', TIME_SET: 'Zaman ayarı',
MANAGE_USERS: 'Kullanıcıları yönet', MANAGE_USERS: 'Kullanıcıları yönet',
@@ -349,7 +347,11 @@ const tr: Translation = {
COMMANDS_HELP_1: 'Özel komutları EMS hattına tanımlayın', COMMANDS_HELP_1: 'Özel komutları EMS hattına tanımlayın',
COMMAND_EXECUTED: 'Komut başarıyla çalıştırıldı', COMMAND_EXECUTED: 'Komut başarıyla çalıştırıldı',
RUN: 'Komutu çalıştır', RUN: 'Komutu çalıştır',
INTERNET_CONNECTION_CHECK: 'Online bağlantısı kontrol ediliyor' INTERNET_CONNECTION_CHECK: 'Online bağlantısı kontrol ediliyor',
UPLOAD_BACKUP_TEXT: 'Yeni bir firmware dosyası (.bin) veya yedek dosyası (.json) yükle',
UPLOAD_FIRMWARE_TEXT: 'Bir firmware .bin dosyası veya buraya tıklayın',
UPLOAD_MD5_RECEIVED: 'Özet alındı, şimdi firmware .bin dosyasını yükleyin',
UPLOAD_MD5_MATCHED: 'MD5 eşleşti, firmware yükleniyor...'
}; };
export default tr; export default tr;
+1
View File
@@ -57,6 +57,7 @@
"assumeChangesOnlyAffectDirectDependencies": true, "assumeChangesOnlyAffectDirectDependencies": true,
// Path mapping for cleaner imports // Path mapping for cleaner imports
"ignoreDeprecations": "6.0",
"baseUrl": ".", "baseUrl": ".",
"paths": { "paths": {
"@/*": ["src/*"], "@/*": ["src/*"],
-3
View File
@@ -207,9 +207,6 @@ export default defineConfig(
async ({ command, mode }: { command: string; mode: string }) => { async ({ command, mode }: { command: string; mode: string }) => {
if (command === 'serve') { if (command === 'serve') {
console.log(`Preparing for standalone build with server, mode=${mode}`); console.log(`Preparing for standalone build with server, mode=${mode}`);
// Imported through a computed URL so the config bundler leaves it as a real
// runtime import: mock-api is a separate package with its own node_modules,
// and inlining it here would drag its dependencies into every build.
const mockServerUrl = pathToFileURL( const mockServerUrl = pathToFileURL(
path.resolve(import.meta.dirname, '../mock-api/mockServer.js') path.resolve(import.meta.dirname, '../mock-api/mockServer.js')
).href; ).href;
+1
View File
@@ -29,6 +29,7 @@
NativeConsole Serial; NativeConsole Serial;
EspClass ESP;
ETHClass ETH; ETHClass ETH;
WiFiClass WiFi; WiFiClass WiFi;
+9
View File
@@ -34,6 +34,15 @@
#include "WString.h" #include "WString.h"
#include "Network.h" #include "Network.h"
// stub of Arduino-ESP32's EspClass, holding only what is called outside of #ifndef EMSESP_STANDALONE
class EspClass {
public:
size_t getPsramSize() {
return 0; // standalone has no PSRAM
}
};
extern EspClass ESP;
extern ETHClass ETH; extern ETHClass ETH;
extern WiFiClass WiFi; extern WiFiClass WiFi;
+106 -115
View File
@@ -1,27 +1,11 @@
// Mock server for development // EMS-ESP standalone mode to simulate
// Simulates file uploads and EventSource (SSE) for log messages // a REST server for file uploads
import formidable from 'formidable'; // an EventSource (Server-Sent Events) for log messages in EMS-ESP standalone mode
// Constants reused across requests
const VALID_EXTENSIONS = new Set(['bin', 'json', 'md5']);
const ONE_SECOND_MS = 1000; const ONE_SECOND_MS = 1000;
const TEN_PERCENT = 10;
// padding function // padding function
const pad = (number) => String(number).padStart(2, '0'); const pad = (number) => String(number).padStart(2, '0');
// Simple throttle helper (time-based)
const throttle = (fn, intervalMs) => {
let last = 0;
return (...args) => {
const now = Date.now();
if (now - last >= intervalMs) {
last = now;
fn(...args);
}
};
};
// Cached date formatter to avoid prototype pollution // Cached date formatter to avoid prototype pollution
const formatDate = (date) => { const formatDate = (date) => {
const year = date.getUTCFullYear(); const year = date.getUTCFullYear();
@@ -38,108 +22,115 @@ const formatDate = (date) => {
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`; return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;
}; };
const MOCK_REST_ORIGIN = 'http://localhost:3080';
const UPLOAD_SIMULATED_KB_PER_SEC = 256;
const UPLOAD_SLICE_BYTES = 16 * 1024;
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const readRequestThrottled = (req) =>
new Promise((resolve, reject) => {
const chunks = [];
let ended = false;
let settled = false;
const settle = (settler, value) => {
if (settled) {
return;
}
settled = true;
settler(value);
};
req.on('error', (error) => settle(reject, error));
req.on('end', () => {
ended = true;
void step();
});
const step = async () => {
if (settled) {
return;
}
try {
const chunk = req.read(UPLOAD_SLICE_BYTES);
if (chunk) {
chunks.push(chunk);
await sleep((chunk.length / (UPLOAD_SIMULATED_KB_PER_SEC * 1024)) * 1000);
void step();
return;
}
if (ended || req.readableEnded) {
settle(resolve, Buffer.concat(chunks));
return;
}
req.once('readable', () => {
void step();
});
} catch (error) {
settle(reject, error);
}
};
void step();
});
const forwardThrottledUpload = async (req, res) => {
const startedAt = Date.now();
try {
const body = await readRequestThrottled(req);
console.log(
`Upload received: ${body.length} bytes in ${((Date.now() - startedAt) / 1000).toFixed(1)}s`
);
const headers = {};
if (req.headers['content-type']) {
headers['content-type'] = req.headers['content-type'];
}
if (req.headers.authorization) {
headers.authorization = req.headers.authorization;
}
headers['content-length'] = String(body.length);
const bunRes = await fetch(`${MOCK_REST_ORIGIN}${req.url}`, {
method: 'POST',
headers,
body
});
const buf = Buffer.from(await bunRes.arrayBuffer());
res.statusCode = bunRes.status;
bunRes.headers.forEach((value, key) => {
if (key !== 'transfer-encoding' && key !== 'content-encoding') {
res.setHeader(key, value);
}
});
res.end(buf);
} catch (error) {
if (error?.code === 'ECONNRESET' || req.destroyed) {
console.log('Upload cancelled by the client');
} else {
console.error('Throttled upload proxy failed', error);
}
if (!res.headersSent) {
res.statusCode = 502;
}
if (!res.writableEnded) {
res.end();
}
}
};
export default () => { export default () => {
return { return {
name: 'vite:mockserver', name: 'vite:mockServer',
configureServer: async (server) => { configureServer: async (server) => {
server.middlewares.use(async (req, res, next) => { server.middlewares.use(async (req, res, next) => {
// Handle file uploads if (req.url.startsWith('/rest/uploadFile') && req.method === 'POST') {
if (req.url.startsWith('/rest/uploadFile')) { await forwardThrottledUpload(req, res);
// CORS preflight support return;
if (req.method === 'OPTIONS') {
res.writeHead(204, {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Cache-Control',
'Access-Control-Max-Age': '600'
});
res.end();
return;
}
if (req.method !== 'POST') {
res.statusCode = 405;
res.setHeader('Allow', 'POST, OPTIONS');
res.end('Method Not Allowed');
return;
}
const fileSize = parseInt(req.headers['content-length'] || '0', 10);
let progress = 0;
// Track upload progress
const logThrottled = throttle((percentage) => {
console.log(`Upload progress: ${percentage}%`);
}, ONE_SECOND_MS);
req.on('data', (chunk) => {
progress += chunk.length;
if (fileSize > 0) {
const percentage = Math.round((progress / fileSize) * 100);
// Only log every ~1s and for meaningful changes (>=10%)
if (percentage % TEN_PERCENT === 0) {
logThrottled(percentage);
}
}
});
try {
const form = formidable({
maxFileSize: 50 * 1024 * 1024, // 50MB limit
keepExtensions: true,
multiples: false,
allowEmptyFiles: false
});
const [fields, files] = await form.parse(req);
if (Object.keys(files).length === 0) {
res.statusCode = 400;
res.end('No file uploaded');
return;
}
const uploadedFile = Array.isArray(files.file)
? files.file[0]
: files.file;
const fileName = uploadedFile.originalFilename;
const fileExtension = fileName
.substring(fileName.lastIndexOf('.') + 1)
.toLowerCase();
console.log(
`File uploaded: ${fileName} (${fileExtension}, ${fileSize} bytes)`
);
// Validate file extension
if (!VALID_EXTENSIONS.has(fileExtension)) {
res.statusCode = 406;
res.end('Invalid file extension');
return;
}
// Handle different file types
if (fileExtension === 'md5') {
res.setHeader('Content-Type', 'application/json');
res.end(
JSON.stringify({
md5: 'ef4304fc4d9025a58dcf25d71c882d2c'
})
);
} else {
console.log('File uploaded successfully!');
res.end();
}
} catch (err) {
console.error('Upload error:', err && err.message ? err.message : err);
res.statusCode = err.httpCode || 400;
res.setHeader('Content-Type', 'text/plain');
res.end(err && err.message ? err.message : 'Upload error');
}
} }
// Handle Server-Sent Events (SSE) for log streaming // Handle Server-Sent Events (SSE) for log streaming
else if (req.url.startsWith('/es/log')) { if (req.url.startsWith('/es/log')) {
// Set SSE headers // Set SSE headers
res.writeHead(200, { res.writeHead(200, {
Connection: 'keep-alive', Connection: 'keep-alive',
@@ -210,7 +201,7 @@ export default () => {
res.on('error', cleanup); res.on('error', cleanup);
res.on('finish', cleanup); res.on('finish', cleanup);
} else { } else {
next(); // Continue to next middleware next(); // Continue to next middleware (Vite proxy → restServer)
} }
}); });
} }
+1 -2
View File
@@ -11,12 +11,11 @@
}, },
"dependencies": { "dependencies": {
"@msgpack/msgpack": "^3.1.3", "@msgpack/msgpack": "^3.1.3",
"formidable": "^3.5.4",
"itty-router": "^5.0.24" "itty-router": "^5.0.24"
}, },
"devDependencies": { "devDependencies": {
"@trivago/prettier-plugin-sort-imports": "^6.0.2", "@trivago/prettier-plugin-sort-imports": "^6.0.2",
"prettier": "^3.9.6" "prettier": "^3.9.6"
}, },
"packageManager": "pnpm@11.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' lockfileVersion: '9.0'
settings: settings:
@@ -11,9 +112,6 @@ importers:
'@msgpack/msgpack': '@msgpack/msgpack':
specifier: ^3.1.3 specifier: ^3.1.3
version: 3.1.3 version: 3.1.3
formidable:
specifier: ^3.5.4
version: 3.5.4
itty-router: itty-router:
specifier: ^5.0.24 specifier: ^5.0.24
version: 5.0.24 version: 5.0.24
@@ -81,13 +179,6 @@ packages:
resolution: {integrity: sha512-47XIizs9XZXvuJgoaJUIE2lFoID8ugvc0jzSHP+Ptfk8nTbnR8g788wv48N03Kx0UkAv559HWRQ3yzOgzlRNUA==} resolution: {integrity: sha512-47XIizs9XZXvuJgoaJUIE2lFoID8ugvc0jzSHP+Ptfk8nTbnR8g788wv48N03Kx0UkAv559HWRQ3yzOgzlRNUA==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
'@noble/hashes@1.8.0':
resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==}
engines: {node: ^14.21.3 || >=16}
'@paralleldrive/cuid2@2.3.1':
resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==}
'@trivago/prettier-plugin-sort-imports@6.0.2': '@trivago/prettier-plugin-sort-imports@6.0.2':
resolution: {integrity: sha512-3DgfkukFyC/sE/VuYjaUUWoFfuVjPK55vOFDsxD56XXynFMCZDYFogH2l/hDfOsQAm1myoU/1xByJ3tWqtulXA==} resolution: {integrity: sha512-3DgfkukFyC/sE/VuYjaUUWoFfuVjPK55vOFDsxD56XXynFMCZDYFogH2l/hDfOsQAm1myoU/1xByJ3tWqtulXA==}
engines: {node: '>= 20'} engines: {node: '>= 20'}
@@ -107,9 +198,6 @@ packages:
svelte: svelte:
optional: true optional: true
asap@2.0.6:
resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
balanced-match@1.0.2: balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
@@ -125,13 +213,6 @@ packages:
supports-color: supports-color:
optional: true optional: true
dezalgo@1.0.4:
resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==}
formidable@3.5.4:
resolution: {integrity: sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==}
engines: {node: '>=14.0.0'}
itty-router@5.0.24: itty-router@5.0.24:
resolution: {integrity: sha512-PXij1qGKtE6jg3dLgrTRdh/Frovl5Wc4Av67sD2xfhDPrgNt4u79++/il8/c/OfZGkhD/8uYJub8tjo+H165rA==} resolution: {integrity: sha512-PXij1qGKtE6jg3dLgrTRdh/Frovl5Wc4Av67sD2xfhDPrgNt4u79++/il8/c/OfZGkhD/8uYJub8tjo+H165rA==}
@@ -156,9 +237,6 @@ packages:
ms@2.1.3: ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
once@1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
parse-imports-exports@0.2.4: parse-imports-exports@0.2.4:
resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==}
@@ -173,9 +251,6 @@ packages:
engines: {node: '>=14'} engines: {node: '>=14'}
hasBin: true hasBin: true
wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
snapshots: snapshots:
'@babel/code-frame@7.29.7': '@babel/code-frame@7.29.7':
@@ -241,12 +316,6 @@ snapshots:
'@msgpack/msgpack@3.1.3': {} '@msgpack/msgpack@3.1.3': {}
'@noble/hashes@1.8.0': {}
'@paralleldrive/cuid2@2.3.1':
dependencies:
'@noble/hashes': 1.8.0
'@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.9.6)': '@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.9.6)':
dependencies: dependencies:
'@babel/generator': 7.29.8 '@babel/generator': 7.29.8
@@ -261,8 +330,6 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
asap@2.0.6: {}
balanced-match@1.0.2: {} balanced-match@1.0.2: {}
brace-expansion@2.1.4: brace-expansion@2.1.4:
@@ -273,17 +340,6 @@ snapshots:
dependencies: dependencies:
ms: 2.1.3 ms: 2.1.3
dezalgo@1.0.4:
dependencies:
asap: 2.0.6
wrappy: 1.0.2
formidable@3.5.4:
dependencies:
'@paralleldrive/cuid2': 2.3.1
dezalgo: 1.0.4
once: 1.4.0
itty-router@5.0.24: {} itty-router@5.0.24: {}
javascript-natural-sort@0.7.1: {} javascript-natural-sort@0.7.1: {}
@@ -300,10 +356,6 @@ snapshots:
ms@2.1.3: {} ms@2.1.3: {}
once@1.4.0:
dependencies:
wrappy: 1.0.2
parse-imports-exports@0.2.4: parse-imports-exports@0.2.4:
dependencies: dependencies:
parse-statements: 1.0.11 parse-statements: 1.0.11
@@ -313,5 +365,3 @@ snapshots:
picocolors@1.1.1: {} picocolors@1.1.1: {}
prettier@3.9.6: {} prettier@3.9.6: {}
wrappy@1.0.2: {}
+81 -24
View File
@@ -239,6 +239,17 @@ switch (emulate_esp) {
// GLOBAL VARIABLES // GLOBAL VARIABLES
let countWifiScanPoll = 0; // wifi network scan let countWifiScanPoll = 0; // wifi network scan
let countHardwarePoll = 0; // for during an upload let countHardwarePoll = 0; // for during an upload
let pendingFirmwareMd5 = false; // set by a .md5 upload, cleared by the next .bin
const VALID_UPLOAD_EXTENSIONS = new Set(['bin', 'json', 'md5']);
function parseMd5Digest(text: string): string | null {
const token = text.trim().split(/\s+/)[0];
if (/^[0-9a-fA-F]{32}$/.test(token)) {
return token.toLowerCase();
}
return null;
}
// DeviceTypes // DeviceTypes
const enum ScheduleFlag { const enum ScheduleFlag {
@@ -329,10 +340,10 @@ function updateMask(entity: any, de: any, dd: any) {
const old_custom_name = dd.nodes[dd_objIndex].cn; const old_custom_name = dd.nodes[dd_objIndex].cn;
console.log( console.log(
'comparing names, old (' + 'comparing names, old (' +
old_custom_name + old_custom_name +
') with new (' + ') with new (' +
new_custom_name + new_custom_name +
')' ')'
); );
if (old_custom_name !== new_custom_name) { if (old_custom_name !== new_custom_name) {
changed = true; changed = true;
@@ -434,24 +445,28 @@ function upgradeImportantMessages(version: string) {
// 0 is do nothing // 0 is do nothing
// 1 means 3.9 and factory reset required // 1 means 3.9 and factory reset required
// 2 means a major version upgrade // 2 means a major version upgrade
let upgradeImportantMessageType_n = 0; let upgradeImportantMessageType_n = 0;
// see if its a filename with a .bin extension // check file extensions
if (version.endsWith('.bin')) { if (version.endsWith('.md5') || version.endsWith('.json')) {
upgradeImportantMessageType_n = 1; // make it 1, for testing, meaning factory reset required upgradeImportantMessageType_n = 0; // digest / backup restore: no upgrade warning
} else if (version.endsWith('.md')) { } else if (version.endsWith('.bin')) {
upgradeImportantMessageType_n = 0; // use default 0, no message // extract the version number from the filename and if its going from 3.8.x to 3.9.x, then set upgradeImportantMessageType_n to 1
const versionNumber = version.split('.');
if (versionNumber[0] === '3' && versionNumber[1] === '8') {
upgradeImportantMessageType_n = 1; // make it 1, factory reset required
}
} else { } else {
// this is a version string like "3.9.0" // this is a version string like "3.9.0"
// upgradeImportantMessageType_n = 2; // make it 2, for testing, meaning a major version upgrade
upgradeImportantMessageType_n = 1; // make it 1, for testing, meaning a factory reset is required upgradeImportantMessageType_n = 1; // make it 1, for testing, meaning a factory reset is required
} }
console.log( console.log(
'upgradeImportantMessageType: version=' + 'upgradeImportantMessageType: version=' +
version + version +
' type=' + ' type=' +
upgradeImportantMessageType_n upgradeImportantMessageType_n
); );
return { upgradeImportantMessageType: upgradeImportantMessageType_n }; return { upgradeImportantMessageType: upgradeImportantMessageType_n };
} }
@@ -502,17 +517,17 @@ function get_versions() {
console.log( console.log(
'getVersions: current=' + 'getVersions: current=' +
THIS_VERSION + THIS_VERSION +
' stable=' + ' stable=' +
LATEST_STABLE_VERSION + LATEST_STABLE_VERSION +
' (upgradeable=' + ' (upgradeable=' +
(STABLE_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO') + (STABLE_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO') +
') dev=' + ') dev=' +
LATEST_DEV_VERSION + LATEST_DEV_VERSION +
' (upgradeable=' + ' (upgradeable=' +
(DEV_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO') + (DEV_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO') +
')' + ')' +
(MOCK_OFFLINE ? ' [offline]' : '') (MOCK_OFFLINE ? ' [offline]' : '')
); );
return data; return data;
} }
@@ -774,6 +789,7 @@ const EMSESP_COMMANDS_ENDPOINT = REST_ENDPOINT_ROOT + 'commands';
const EMSESP_CUSTOMENTITIES_ENDPOINT = REST_ENDPOINT_ROOT + 'customEntities'; const EMSESP_CUSTOMENTITIES_ENDPOINT = REST_ENDPOINT_ROOT + 'customEntities';
const EMSESP_MODULES_ENDPOINT = REST_ENDPOINT_ROOT + 'modules'; const EMSESP_MODULES_ENDPOINT = REST_ENDPOINT_ROOT + 'modules';
const EMSESP_ACTION_ENDPOINT = REST_ENDPOINT_ROOT + 'action'; const EMSESP_ACTION_ENDPOINT = REST_ENDPOINT_ROOT + 'action';
const EMSESP_UPLOAD_FILE_ENDPOINT = REST_ENDPOINT_ROOT + 'uploadFile';
// these are used in the API calls only // these are used in the API calls only
const EMSESP_SYSTEM_INFO_ENDPOINT = API_ENDPOINT_ROOT + 'system/info'; const EMSESP_SYSTEM_INFO_ENDPOINT = API_ENDPOINT_ROOT + 'system/info';
@@ -4637,6 +4653,47 @@ router
// SYSTEM and SETTINGS // SYSTEM and SETTINGS
router router
.post(EMSESP_UPLOAD_FILE_ENDPOINT, async (request: Request) => {
const formData = await request.formData();
const uploaded = formData.get('file');
if (!uploaded || typeof uploaded === 'string') {
return status(400);
}
const fileName = uploaded.name || '';
const fileExtension = fileName.includes('.')
? fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase()
: '';
console.log(
`File uploaded: ${fileName} (${fileExtension}, ${uploaded.size} bytes)`
);
if (!VALID_UPLOAD_EXTENSIONS.has(fileExtension)) {
console.log('Invalid file extension');
return status(406);
}
if (fileExtension === 'md5') {
const digest = parseMd5Digest(await uploaded.text());
if (!digest) {
console.log('Invalid MD5 digest file');
return status(406);
}
pendingFirmwareMd5 = true;
console.log('MD5 digest received', digest);
return { md5: digest };
}
if (fileExtension === 'bin' && pendingFirmwareMd5) {
pendingFirmwareMd5 = false;
console.log('Firmware MD5 matches');
return { md5_ok: true };
}
pendingFirmwareMd5 = false;
console.log('File uploaded successfully!');
return status(200);
})
.get(ACTIVITY_ENDPOINT, () => activity) .get(ACTIVITY_ENDPOINT, () => activity)
.get(SYSTEM_STATUS_ENDPOINT, async () => { .get(SYSTEM_STATUS_ENDPOINT, async () => {
if (countHardwarePoll >= 2) { if (countHardwarePoll >= 2) {
+3 -1
View File
@@ -744,7 +744,7 @@ mlongcalls
mmio mmio
mmode mmode
mmplus mmplus
mockserver mockServer
modbus modbus
modee modee
modetype modetype
@@ -1348,3 +1348,5 @@ dhcpc
wifioff wifioff
autonegotiation 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)) { if (_reconfigureMqtt || (_disconnectedAt && static_cast<uint32_t>(uuid::get_uptime() - _disconnectedAt) >= MQTT_RECONNECTION_DELAY)) {
// configure MQTT client // configure MQTT client
if (_reconfigureMqtt) { if (_reconfigureMqtt && _state.enabled) {
emsesp::EMSESP::logger().info("Starting MQTT service"); emsesp::EMSESP::logger().info("Starting MQTT service");
} }
_disconnectedAt = configureMqtt() ? 0 : uuid::get_uptime(); _disconnectedAt = configureMqtt() ? 0 : uuid::get_uptime();
@@ -130,6 +130,7 @@ MqttClient * MqttSettingsService::getMqttClient() {
void MqttSettingsService::onMqttConnect(bool sessionPresent) { void MqttSettingsService::onMqttConnect(bool sessionPresent) {
(void)sessionPresent; (void)sessionPresent;
emsesp::EMSESP::mqtt_.on_connect(); emsesp::EMSESP::mqtt_.on_connect();
_disconnectReason = espMqttClientTypes::DisconnectReason::USER_OK;
} }
void MqttSettingsService::onMqttDisconnect(espMqttClientTypes::DisconnectReason reason) { void MqttSettingsService::onMqttDisconnect(espMqttClientTypes::DisconnectReason reason) {
@@ -158,6 +159,9 @@ bool MqttSettingsService::configureMqtt() {
emsesp::EMSESP::logger().debug("Disconnecting to configure"); emsesp::EMSESP::logger().debug("Disconnecting to configure");
#endif #endif
_mqttClient->disconnect(true); _mqttClient->disconnect(true);
if (!_state.enabled) {
emsesp::EMSESP::logger().info("Stopping MQTT client");
}
} }
// only connect if WiFi is connected and MQTT is enabled // only connect if WiFi is connected and MQTT is enabled
+47 -7
View File
@@ -13,10 +13,32 @@ static String getFilenameExtension(const String & filename) {
return {}; return {};
} }
// Accepts a raw 32-char hex digest, optionally with trailing newline or a GNU "hash filename" suffix.
static bool parseMd5Digest(const uint8_t * data, size_t len, std::array<char, 33> & out) {
size_t i = 0;
while (i < len && (data[i] == ' ' || data[i] == '\t' || data[i] == '\r' || data[i] == '\n')) {
++i;
}
if (len - i < 32) {
return false;
}
for (size_t n = 0; n < 32; n++) {
const char c = static_cast<char>(data[i + n]);
const bool hex = (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');
if (!hex) {
return false;
}
out[n] = (c >= 'A' && c <= 'F') ? static_cast<char>(c - 'A' + 'a') : c;
}
out[32] = '\0';
return true;
}
UploadFileService::UploadFileService(AsyncWebServer * server, SecurityManager * securityManager) UploadFileService::UploadFileService(AsyncWebServer * server, SecurityManager * securityManager)
: _securityManager(securityManager) : _securityManager(securityManager)
, _is_firmware(false) , _is_firmware(false)
, _is_filesystem(false) , _is_filesystem(false)
, _md5_applied(false)
, _md5() { , _md5() {
server->on( server->on(
UPLOAD_FILE_PATH, UPLOAD_FILE_PATH,
@@ -48,18 +70,23 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri
// LittleFS filesystem image // LittleFS filesystem image
_is_filesystem = true; _is_filesystem = true;
_md5[0] = '\0'; // clear any stale md5 so Update.end() doesn't compare against it _md5[0] = '\0'; // clear any stale md5 so Update.end() doesn't compare against it
_md5_applied = false;
} else if ((extension == "bin") && (filesize > 1000000)) { } else if ((extension == "bin") && (filesize > 1000000)) {
_is_firmware = true; _is_firmware = true;
} else if (extension == "json") { } else if (extension == "json") {
_md5[0] = '\0'; // clear md5 _md5[0] = '\0'; // clear md5
_md5_applied = false;
} else if (extension == "md5") { } else if (extension == "md5") {
if (len == _md5.size() - 1) { if (!parseMd5Digest(data, len, _md5)) {
std::memcpy(_md5.data(), data, _md5.size() - 1); emsesp::EMSESP::logger().err("Invalid MD5 digest file");
_md5.back() = '\0'; handleError(request, 406); // Not Acceptable
} else {
emsesp::EMSESP::logger().info("MD5 digest received (%s). Now upload the firmware BIN", _md5.data());
} }
return; return;
} else { } else {
_md5.front() = '\0'; _md5.front() = '\0';
_md5_applied = false;
emsesp::EMSESP::logger().err("Unsupported file type: %s, size: %u", filename.c_str(), filesize); emsesp::EMSESP::logger().err("Unsupported file type: %s, size: %u", filename.c_str(), filesize);
handleError(request, 406); // Not Acceptable - unsupported file type handleError(request, 406); // Not Acceptable - unsupported file type
return; return;
@@ -103,9 +130,11 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri
emsesp::EMSESP::system_.systemStatus(emsesp::SYSTEM_STATUS::SYSTEM_STATUS_UPLOADING); emsesp::EMSESP::system_.systemStatus(emsesp::SYSTEM_STATUS::SYSTEM_STATUS_UPLOADING);
if (Update.begin(filesize - sizeof(esp_image_header_t))) { if (Update.begin(filesize - sizeof(esp_image_header_t))) {
_md5_applied = false;
if (strlen(_md5.data()) == _md5.size() - 1) { if (strlen(_md5.data()) == _md5.size() - 1) {
Update.setMD5(_md5.data()); Update.setMD5(_md5.data());
_md5.front() = '\0'; _md5_applied = true;
emsesp::EMSESP::logger().info("Firmware MD5 check enabled (%s)", _md5.data());
} }
request->onDisconnect([this] { handleDisconnect(); }); // success, let's make sure we end the update if the client hangs up request->onDisconnect([this] { handleDisconnect(); }); // success, let's make sure we end the update if the client hangs up
} else { } else {
@@ -183,8 +212,19 @@ void UploadFileService::uploadComplete(AsyncWebServerRequest * request) {
emsesp::EMSESP::nvs_.putBool(emsesp::EMSESP_NVS_BOOT_NEW_FIRMWARE, true); emsesp::EMSESP::nvs_.putBool(emsesp::EMSESP_NVS_BOOT_NEW_FIRMWARE, true);
} }
AsyncWebServerResponse * response = request->beginResponse(200); if (_is_firmware && _md5_applied) {
request->send(response); emsesp::EMSESP::logger().info("Firmware MD5 matches");
auto * response = new emsesp::PsramAsyncJsonResponse(false);
JsonObject root = response->getRoot();
root["md5_ok"] = true;
response->setLength();
request->send(response);
_md5.front() = '\0';
_md5_applied = false;
} else {
AsyncWebServerResponse * response = request->beginResponse(200);
request->send(response);
}
emsesp::EMSESP::system_.systemStatus( emsesp::EMSESP::system_.systemStatus(
emsesp::SYSTEM_STATUS::SYSTEM_STATUS_PENDING_RESTART); // will be handled by the main loop. We use pending for the Web's SystemMonitor emsesp::SYSTEM_STATUS::SYSTEM_STATUS_PENDING_RESTART); // will be handled by the main loop. We use pending for the Web's SystemMonitor
return; return;
+1
View File
@@ -23,6 +23,7 @@ class UploadFileService {
SecurityManager * _securityManager; SecurityManager * _securityManager;
bool _is_firmware; bool _is_firmware;
bool _is_filesystem; bool _is_filesystem;
bool _md5_applied; // true if an MD5 digest was applied to the current firmware upload
std::array<char, 33> _md5; std::array<char, 33> _md5;
void handleUpload(AsyncWebServerRequest * request, const String & filename, size_t index, uint8_t * data, size_t len, bool final); void handleUpload(AsyncWebServerRequest * request, const String & filename, size_t index, uint8_t * data, size_t len, bool final);
+28 -29
View File
@@ -295,36 +295,35 @@ static void setup_commands(std::shared_ptr<Commands> const & commands) {
}); });
commands->add_command( commands->add_command(ShellContext::MAIN,
ShellContext::MAIN, CommandFlags::ADMIN,
CommandFlags::ADMIN, string_vector{F_(set), F_(board_profile)},
string_vector{F_(set), F_(board_profile)}, {F_(name_mandatory)},
{F_(name_mandatory)}, [](Shell & shell, const std::vector<std::string> & arguments) {
[](Shell & shell, const std::vector<std::string> & arguments) { std::vector<int8_t> data; // led, dallas, rx, tx, button, phy_type, eth_power, eth_phy_addr, eth_clock_mode
std::vector<int8_t> data; // led, dallas, rx, tx, button, phy_type, eth_power, eth_phy_addr, eth_clock_mode std::string board_profile = Helpers::toUpper(arguments.front());
std::string board_profile = Helpers::toUpper(arguments.front()); if (!EMSESP::system_.load_board_profile(data, board_profile)) {
if (!EMSESP::system_.load_board_profile(data, board_profile)) { shell.println("Invalid board profile (S32, E32, E32V2, E32V2_2, MH-ET, NODEMCU, LOLIN, OLIMEX, OLIMEXPOE, OLIMEXPOEW, "
shell.println( "C3MINI, S2MINI, S3MINI, S32S3, CUSTOM)");
"Invalid board profile (S32, E32, E32V2, E32V2_2, MH-ET, NODEMCU, LOLIN, OLIMEX, OLIMEXPOE, C3MINI, S2MINI, S3MINI, S32S3, CUSTOM)"); return;
return; }
}
EMSESP::webSettingsService.update([&](WebSettings & settings) { EMSESP::webSettingsService.update([&](WebSettings & settings) {
settings.board_profile = board_profile.c_str(); settings.board_profile = board_profile.c_str();
settings.led_gpio = data[0]; settings.led_gpio = data[0];
settings.dallas_gpio = data[1]; settings.dallas_gpio = data[1];
settings.rx_gpio = data[2]; settings.rx_gpio = data[2];
settings.tx_gpio = data[3]; settings.tx_gpio = data[3];
settings.pbutton_gpio = data[4]; settings.pbutton_gpio = data[4];
settings.phy_type = data[5]; settings.phy_type = data[5];
settings.eth_power = data[6]; // can be -1 settings.eth_power = data[6]; // can be -1
settings.eth_phy_addr = data[7]; settings.eth_phy_addr = data[7];
settings.eth_clock_mode = data[8]; settings.eth_clock_mode = data[8];
return StateUpdateResult::CHANGED; return StateUpdateResult::CHANGED;
}); });
shell.printfln("Loaded board profile %s. Restarting...", board_profile.c_str()); shell.printfln("Loaded board profile %s. Restarting...", board_profile.c_str());
EMSESP::system_.system_restart(); EMSESP::system_.system_restart();
}); });
commands->add_command( commands->add_command(
ShellContext::MAIN, ShellContext::MAIN,
+8 -12
View File
@@ -1740,15 +1740,16 @@ void EMSESP::start() {
bool factory_settings = false; bool factory_settings = false;
#endif #endif
// #if defined(EMSESP_DEBUG)
// LOG_DEBUG("Listing root directory before:");
// system_.listDir("/", 3); // show the contents of the root directory
// #endif
// start NVS storage // start NVS storage
if (!nvs_.begin("ems-esp", false, "nvs1")) { // try bigger nvs partition on 16M flash first #ifndef EMSESP_STANDALONE
nvs_.begin("ems-esp", false, "nvs"); // fallback to small nvs if (esp_partition_find(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_NVS, "nvs1")) {
nvs_.begin("ems-esp", false, "nvs1");
} else {
nvs_.begin("ems-esp", false, "nvs"); // fallback to small nvs
} }
#else
nvs_.begin("ems-esp", false, "nvs");
#endif
// set valid GPIOs list based on ESP32 chip/platform type // set valid GPIOs list based on ESP32 chip/platform type
system_.set_valid_system_gpios(); system_.set_valid_system_gpios();
@@ -1759,11 +1760,6 @@ void EMSESP::start() {
// loads core system services settings (mqtt, ap, ntp etc) // loads core system services settings (mqtt, ap, ntp etc)
esp32React.begin(); esp32React.begin();
// #if defined(EMSESP_DEBUG)
// LOG_DEBUG("Listing root directory after:");
// system_.listDir("/", 3); // show the contents of the root directory
// #endif
#ifndef EMSESP_STANDALONE #ifndef EMSESP_STANDALONE
if (factory_settings) { if (factory_settings) {
LOG_WARNING("No settings found on filesystem. Using factory settings."); LOG_WARNING("No settings found on filesystem. Using factory settings.");
+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(pumpCharacter, "pumpcharacter", "boiler pump characteristic", "Charakteristik der Kesselpumpe", "karakteristiek ketelpomp", "pannpumpsegenskaper", "charakterystyka pompy kotłowej", "kjelepumpekarakteristikk", "caractéristique de la pompe de la chaudière", "kazan pompası karakteristiği", "caratteristica della pompa della caldaia", "charakteristika kotlového čerpadla", "charakteristika čerpadla kotle")
MAKE_TRANSLATION(pumpOnTemp, "pumpontemp", "pump logic temperature", "Pumpenlogiktemperatur", "pomplogica temperatuur", "Pumplogiktemperatur", "temperatura logiki pompy", "pumpelogikktemperatur", "température logique pompe", "pompa mantık sıcaklığı", "temperatura logica pompa", "teplota logiky čerpadla", "teplota logiky čerpadla") MAKE_TRANSLATION(pumpOnTemp, "pumpontemp", "pump logic temperature", "Pumpenlogiktemperatur", "pomplogica temperatuur", "Pumplogiktemperatur", "temperatura logiki pompy", "pumpelogikktemperatur", "température logique pompe", "pompa mantık sıcaklığı", "temperatura logica pompa", "teplota logiky čerpadla", "teplota logiky čerpadla")
MAKE_TRANSLATION(headertemp, "headertemp", "low loss header", "Hydr. Weiche", "open verdeler", "Fördelare", "sprzęgło hydrauliczne", "lav tap header", "bouteille de déc. hydr.", "isı bloğu gidiş suyu sıc.", "comp. idr.", "nízkostratová hlavica", "hydraulický oddělovač") MAKE_TRANSLATION(headertemp, "headertemp", "low loss header", "Hydr. Weiche", "open verdeler", "Fördelare", "sprzęgło hydrauliczne", "lav tap header", "bouteille de déc. hydr.", "isı bloğu gidiş suyu sıc.", "comp. idr.", "nízkostratová hlavica", "hydraulický oddělovač")
MAKE_TRANSLATION(heatblock, "heatblock", "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(pumpKickHour, "pumpkickhour", "pump kick hour", "Stunde Pumpkick")
MAKE_TRANSLATION(pumpKickDay, "pumpkickday", "pump kick day", "Tag Pumpkick") MAKE_TRANSLATION(pumpKickDay, "pumpkickday", "pump kick day", "Tag Pumpkick")
MAKE_TRANSLATION(pumpKickDelay, "pumpkickdelay", "pump kick delay", "Pause vor Pumpkick") MAKE_TRANSLATION(pumpKickDelay, "pumpkickdelay", "pump kick delay", "Pause vor Pumpkick")
+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 // boards without an Ethernet PHY skip straight to WIFI; without a configured SSID, straight to AP
// (unless AP provision mode is Never — then stay on WIFI and keep waiting) // (unless AP provision mode is Never — then stay on WIFI and keep waiting)
NetPhase Network::initialPhase() const { NetPhase Network::initialPhase() const {
if (phy_type_ != PHY_type::PHY_TYPE_NONE) { #if CONFIG_IDF_TARGET_ESP32
bool eth_clock_conflicts_psram =
ESP.getPsramSize() && ((eth_clock_mode_t)eth_clock_mode_ == ETH_CLOCK_GPIO16_OUT || (eth_clock_mode_t)eth_clock_mode_ == ETH_CLOCK_GPIO17_OUT);
if (phy_type_ != PHY_type::PHY_TYPE_NONE && !eth_clock_conflicts_psram) {
return NetPhase::ETHERNET; return NetPhase::ETHERNET;
} }
#endif
if (!ssid_.isEmpty() || ap_provisionMode_ == AP_MODE_NEVER) { if (!ssid_.isEmpty() || ap_provisionMode_ == AP_MODE_NEVER) {
return NetPhase::WIFI; return NetPhase::WIFI;
} }
@@ -600,6 +605,11 @@ void Network::startEthernet() {
return; return;
} }
if (ESP.getPsramSize() && ((eth_clock_mode_t)eth_clock_mode_ == ETH_CLOCK_GPIO16_OUT || (eth_clock_mode_t)eth_clock_mode_ == ETH_CLOCK_GPIO17_OUT)) {
LOG_ERROR("Ethernet clock mode %d (GPIO16/17) conflicts with PSRAM - disabling Ethernet", eth_clock_mode_);
return;
}
/* /*
// The Tasmota SDK is built with CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=2, so the Ethernet MAC is derived as // The Tasmota SDK is built with CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=2, so the Ethernet MAC is derived as
// a locally-administered address from base+1 instead of the universal base+3 that Arduino Core 2 used. // a locally-administered address from base+1 instead of the universal base+3 that Arduino Core 2 used.
+7 -21
View File
@@ -867,7 +867,7 @@ bool System::loop() {
void System::send_info_mqtt() { void System::send_info_mqtt() {
static uint8_t _connection = 0; static uint8_t _connection = 0;
uint8_t connection = (EMSESP::network_.ethernet_connected() ? 1 : 0) + (EMSESP::network_.wifi_connected() ? 2 : 0) + (ntp_connected_ ? 4 : 0) uint8_t connection = (EMSESP::network_.ethernet_connected() ? 1 : 0) + (EMSESP::network_.wifi_connected() ? 2 : 0) + (ntp_connected_ ? 4 : 0)
+ (EMSESP::network_.has_ipv6() ? 8 : 0); + (EMSESP::network_.has_ipv6() ? 8 : 0);
// check if connection status has changed // check if connection status has changed
if (!Mqtt::connected() || connection == _connection) { if (!Mqtt::connected() || connection == _connection) {
return; return;
@@ -1092,6 +1092,7 @@ void System::show_system(uuid::console::Shell & shell) {
shell.println(); shell.println();
shell.println("System:"); shell.println("System:");
shell.printfln(" Version: %s", EMSESP_APP_VERSION); shell.printfln(" Version: %s", EMSESP_APP_VERSION);
shell.printfln(" System name: %s", system_name_.c_str());
#ifndef EMSESP_STANDALONE #ifndef EMSESP_STANDALONE
shell.printfln(" Platform: %s (%s)", EMSESP_PLATFORM, ESP.getChipModel()); shell.printfln(" Platform: %s (%s)", EMSESP_PLATFORM, ESP.getChipModel());
shell.printfln(" Model: %s", getBBQKeesGatewayDetails().c_str()); shell.printfln(" Model: %s", getBBQKeesGatewayDetails().c_str());
@@ -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) { if (ok) {
LOG_INFO("System command '%s' with value '%s'", cmd, value); 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 // https://github.com/OLIMEX/ESP32-POE/blob/master/HARDWARE/ESP32-PoE-hardware-revision-L1/ESP32-PoE_Rev_L1.pdf
// uart0 = 1, 3; SD-card = 2, 14, 15; button = 34; // uart0 = 1, 3; SD-card = 2, 14, 15; button = 34;
valid_system_gpios_ = {4, 34, 36, 12, 13, 21, 22, 25, 26, 27, 32, 33, 39}; valid_system_gpios_ = {4, 34, 36, 12, 13, 21, 22, 25, 26, 27, 32, 33, 39};
} else if (board_profile == "OLIMEXPOEW") {
data = {0, 0, 36, 4, 34, PHY_type::PHY_TYPE_LAN8720, 12, 0, 1, 0}; // Olimex ESP32-POE-ISO WROVER (PSRAM)
valid_system_gpios_ = {4, 34, 36, 12, 13, 21, 22, 25, 26, 27, 32, 33, 39};
} else if (board_profile == "C3MINI") { } else if (board_profile == "C3MINI") {
#if defined(BOARD_C3_MINI_V1) #if defined(BOARD_C3_MINI_V1)
data = {7, 1, 4, 5, 9, PHY_type::PHY_TYPE_NONE, 0, 0, 0, 0}; // Lolin C3 Mini V1 data = {7, 1, 4, 5, 9, PHY_type::PHY_TYPE_NONE, 0, 0, 0, 0}; // Lolin C3 Mini V1
@@ -2914,7 +2900,7 @@ bool System::command_txpause(const char * value, const int8_t) {
return true; return true;
} }
// format command - factory reset, removing all config files // format command - factory reset, removing all settings files
bool System::command_format(const char * value, const int8_t id) { bool System::command_format(const char * value, const int8_t id) {
if (EMSESP::system_.disable_reset()) { if (EMSESP::system_.disable_reset()) {
LOG_NOTICE("Factory reset disabled"); LOG_NOTICE("Factory reset disabled");
@@ -2924,7 +2910,7 @@ bool System::command_format(const char * value, const int8_t id) {
#if !defined(EMSESP_STANDALONE) && !defined(EMSESP_TEST) #if !defined(EMSESP_STANDALONE) && !defined(EMSESP_TEST)
// don't really format the filesystem in test or standalone mode // don't really format the filesystem in test or standalone mode
if (LittleFS.format()) { if (LittleFS.format()) {
LOG_INFO("Filesystem formatted successfully. All config files removed."); LOG_INFO("Filesystem formatted successfully. All settings files removed.");
} else { } else {
LOG_ERROR("Format failed"); LOG_ERROR("Format failed");
} }
+5 -5
View File
@@ -935,7 +935,7 @@ bool Solar::set_heatTransferSystem(const char * value, const int8_t id) {
if (!Helpers::value2bool(value, b)) { if (!Helpers::value2bool(value, b)) {
return false; return false;
} }
write_command(0x358, 5, b ? 0x01 : 0x00, 0x358); write_command(0x358, 5, b ? 0xFF : 0x00); // change is broadcasted
return true; return true;
} }
@@ -945,7 +945,7 @@ bool Solar::set_externalCyl(const char * value, const int8_t id) {
if (!Helpers::value2bool(value, b)) { if (!Helpers::value2bool(value, b)) {
return false; return false;
} }
write_command(0x358, 9, b ? 0x01 : 0x00, 0x358); write_command(0x358, 9, b ? 0xFF : 0x00); // change is broadcasted
return true; return true;
} }
@@ -955,7 +955,7 @@ bool Solar::set_thermalDisinfect(const char * value, const int8_t id) {
if (!Helpers::value2bool(value, b)) { if (!Helpers::value2bool(value, b)) {
return false; return false;
} }
write_command(0x358, 10, b ? 0x01 : 0x00, 0x358); write_command(0x358, 10, b ? 0xFF : 0x00); // change is broadcasted
return true; return true;
} }
@@ -965,7 +965,7 @@ bool Solar::set_heatMetering(const char * value, const int8_t id) {
if (!Helpers::value2bool(value, b)) { if (!Helpers::value2bool(value, b)) {
return false; return false;
} }
write_command(0x358, 14, b ? 0x01 : 0x00, 0x358); write_command(0x358, 14, b ? 0xFF : 0x00); // change is broadcasted
return true; return true;
} }
@@ -978,7 +978,7 @@ bool Solar::set_solarEnabled(const char * value, const int8_t id) {
if (flags() == EMSdevice::EMS_DEVICE_FLAG_SM10) { if (flags() == EMSdevice::EMS_DEVICE_FLAG_SM10) {
write_command(0x96, 0, b ? 0xFF : 0x00, 0x96); write_command(0x96, 0, b ? 0xFF : 0x00, 0x96);
} else { } else {
write_command(0x358, 19, b ? 0x01 : 0x00, 0x358); write_command(0x358, 19, b ? 0xFF : 0x00); // change is broadcasted
} }
return true; return true;
} }
+1 -1
View File
@@ -1 +1 @@
#define EMSESP_APP_VERSION "3.9.0-dev.7" #define EMSESP_APP_VERSION "3.9.0-dev.8"