mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2026-09-13 13:44:10 +00:00
Compare commits
32
Commits
core3
...
5b41217a67
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5b41217a67 | ||
|
|
16caff789d | ||
|
|
835a8762f6 | ||
|
|
90f0c9c01b | ||
|
|
bde9ab53a1 | ||
|
|
901721fb99 | ||
|
|
dac1e1a69c | ||
|
|
1b2371c67a | ||
|
|
0f396200a2 | ||
|
|
1956ff8386 | ||
|
|
3a81c70018 | ||
|
|
7212439f1b | ||
|
|
6f7f343abd | ||
|
|
42e6e31476 | ||
|
|
96cf019f0a | ||
|
|
59b0417297 | ||
|
|
2369277a9e | ||
|
|
e166db8b70 | ||
|
|
36884867f7 | ||
|
|
7fb8eb3592 | ||
|
|
e0f59a4c31 | ||
|
|
7eba8acbb4 | ||
|
|
d0e6a603bb | ||
|
|
36b4dd55a7 | ||
|
|
341a4d4e1d | ||
|
|
a61745b710 | ||
|
|
b1ebd81ca2 | ||
|
|
6487a3be70 | ||
|
|
2eb804de0b | ||
|
|
1ff53e6ac7 | ||
|
|
9cab3b480e | ||
|
|
bacd3faac2 |
@@ -16,6 +16,10 @@ This release is based on the latest Espressif/Arduino core version 3. It brings
|
||||
## Fixed
|
||||
|
||||
- shunting yard show json
|
||||
- memory leak when using different timezones for ems-esp and thermostat[#3184](https://github.com/emsesp/EMS-ESP32/issues/3184)
|
||||
- LED stayed off on a healthy system when "Disable LED" was unchecked
|
||||
- Ethernet MAC address changed with the new SDK, breaking DHCP reservations (currently disabled)
|
||||
- "IPv4 nameserver" showed an IPv6 address when IPv6 was in use
|
||||
|
||||
## Changed
|
||||
|
||||
@@ -24,4 +28,6 @@ This release is based on the latest Espressif/Arduino core version 3. It brings
|
||||
- network fallback to AP only after start [#3090](https://github.com/emsesp/EMS-ESP32/issues/3090)
|
||||
- replaced Web async-validator with custom validator and toast with native snackbar to reduce bundle size
|
||||
- Gateway and Connect devices are shown in the Devices page, but disabled [3126](https://github.com/emsesp/EMS-ESP32/discussions/3126)
|
||||
- show control setting only for master thermostats (0x10) [#3173](https://github.com/emsesp/EMS-ESP32/issues/3173)
|
||||
- remove devices without entities not listed in 0x07 telegram
|
||||
|
||||
|
||||
@@ -5966,7 +5966,6 @@ uint8
|
||||
| hc1.roomtempdiff | room temp difference | uint8 (>=0<=0) | K | true | HC | 42 | 1 | 1 |
|
||||
uint8
|
||||
| hc1.hpminflowtemp | HP min. flow temp. | uint8 (>=0<=0) | C | true | HC | 43 | 1 | 1 |
|
||||
| hc1.control | control device | enum | | true | HC | 44 | 1 | 1 |
|
||||
uint8
|
||||
| hc1.heatondelay | heat-on delay | uint8 (>=1<=48) | hours | true | HC | 47 | 1 | 1 |
|
||||
uint8
|
||||
@@ -6116,7 +6115,6 @@ uint8
|
||||
| hc1.roomtempdiff | room temp difference | uint8 (>=0<=0) | K | true | HC | 42 | 1 | 1 |
|
||||
uint8
|
||||
| hc1.hpminflowtemp | HP min. flow temp. | uint8 (>=0<=0) | C | true | HC | 43 | 1 | 1 |
|
||||
| hc1.control | control device | enum | | true | HC | 44 | 1 | 1 |
|
||||
| hc1.remotetemp | room temperature from remote | cmd | C | true | HC | 45 | 1 | 1/10 |
|
||||
| hc1.remotehum | room humidity from remote | cmd | % | true | HC | 46 | 1 | 1 |
|
||||
uint8
|
||||
@@ -6283,7 +6281,6 @@ uint8
|
||||
| hc1.roomtempdiff | room temp difference | uint8 (>=0<=0) | K | true | HC | 42 | 1 | 1 |
|
||||
uint8
|
||||
| hc1.hpminflowtemp | HP min. flow temp. | uint8 (>=0<=0) | C | true | HC | 43 | 1 | 1 |
|
||||
| hc1.control | control device | enum | | true | HC | 44 | 1 | 1 |
|
||||
| hc1.remotetemp | room temperature from remote | cmd | C | true | HC | 45 | 1 | 1/10 |
|
||||
| hc1.remotehum | room humidity from remote | cmd | % | true | HC | 46 | 1 | 1 |
|
||||
uint8
|
||||
@@ -6806,7 +6803,6 @@ uint8
|
||||
| hc1.ecotemp | eco temperature | uint8 (>=0<=0) | C | true | HC | 5 | 1 | 1/2 |
|
||||
int8
|
||||
| hc1.nofrosttemp | nofrost temperature | int8 (>=0<=0) | C | true | HC | 18 | 1 | 1/2 |
|
||||
| hc1.control | control device | enum | | true | HC | 44 | 1 | 1 |
|
||||
| hc1.program | program | enum | | true | HC | 27 | 1 | 1 |
|
||||
| hc1.remotetemp | room temperature from remote | cmd | C | true | HC | 45 | 1 | 1/10 |
|
||||
| hc1.targetflowtemp | target flow temperature | uint8 | C | false | HC | 19 | 1 | 1 |
|
||||
@@ -6867,7 +6863,6 @@ uint8
|
||||
| hc1.ecotemp | eco temperature | uint8 (>=0<=0) | C | true | HC | 5 | 1 | 1/2 |
|
||||
int8
|
||||
| hc1.nofrosttemp | nofrost temperature | int8 (>=0<=0) | C | true | HC | 18 | 1 | 1/2 |
|
||||
| hc1.control | control device | enum | | true | HC | 44 | 1 | 1 |
|
||||
| hc1.program | program | enum | | true | HC | 27 | 1 | 1 |
|
||||
| hc1.remotetemp | room temperature from remote | cmd | C | true | HC | 45 | 1 | 1/10 |
|
||||
| hc1.targetflowtemp | target flow temperature | uint8 | C | false | HC | 19 | 1 | 1 |
|
||||
@@ -6926,7 +6921,6 @@ uint8
|
||||
| hc1.ecotemp | eco temperature | uint8 (>=0<=0) | C | true | HC | 5 | 1 | 1/2 |
|
||||
int8
|
||||
| hc1.nofrosttemp | nofrost temperature | int8 (>=0<=0) | C | true | HC | 18 | 1 | 1/2 |
|
||||
| hc1.control | control device | enum | | true | HC | 44 | 1 | 1 |
|
||||
| hc1.program | program | enum | | true | HC | 27 | 1 | 1 |
|
||||
| hc1.remotetemp | room temperature from remote | cmd | C | true | HC | 45 | 1 | 1/10 |
|
||||
| hc1.targetflowtemp | target flow temperature | uint8 | C | false | HC | 19 | 1 | 1 |
|
||||
@@ -6985,7 +6979,6 @@ uint8
|
||||
| hc1.ecotemp | eco temperature | uint8 (>=0<=0) | C | true | HC | 5 | 1 | 1/2 |
|
||||
int8
|
||||
| hc1.nofrosttemp | nofrost temperature | int8 (>=0<=0) | C | true | HC | 18 | 1 | 1/2 |
|
||||
| hc1.control | control device | enum | | true | HC | 44 | 1 | 1 |
|
||||
| hc1.program | program | enum | | true | HC | 27 | 1 | 1 |
|
||||
| hc1.remotetemp | room temperature from remote | cmd | C | true | HC | 45 | 1 | 1/10 |
|
||||
| hc1.targetflowtemp | target flow temperature | uint8 | C | false | HC | 19 | 1 | 1 |
|
||||
@@ -7046,7 +7039,6 @@ uint8
|
||||
| hc1.ecotemp | eco temperature | uint8 (>=0<=0) | C | true | HC | 5 | 1 | 1/2 |
|
||||
int8
|
||||
| hc1.nofrosttemp | nofrost temperature | int8 (>=0<=0) | C | true | HC | 18 | 1 | 1/2 |
|
||||
| hc1.control | control device | enum | | true | HC | 44 | 1 | 1 |
|
||||
| hc1.program | program | enum | | true | HC | 27 | 1 | 1 |
|
||||
| hc1.remotetemp | room temperature from remote | cmd | C | true | HC | 45 | 1 | 1/10 |
|
||||
| hc1.targetflowtemp | target flow temperature | uint8 | C | false | HC | 19 | 1 | 1 |
|
||||
@@ -7107,7 +7099,6 @@ uint8
|
||||
| hc1.ecotemp | eco temperature | uint8 (>=0<=0) | C | true | HC | 5 | 1 | 1/2 |
|
||||
int8
|
||||
| hc1.nofrosttemp | nofrost temperature | int8 (>=0<=0) | C | true | HC | 18 | 1 | 1/2 |
|
||||
| hc1.control | control device | enum | | true | HC | 44 | 1 | 1 |
|
||||
| hc1.program | program | enum | | true | HC | 27 | 1 | 1 |
|
||||
| hc1.remotetemp | room temperature from remote | cmd | C | true | HC | 45 | 1 | 1/10 |
|
||||
| hc1.targetflowtemp | target flow temperature | uint8 | C | false | HC | 19 | 1 | 1 |
|
||||
@@ -7166,7 +7157,6 @@ uint8
|
||||
| hc1.ecotemp | eco temperature | uint8 (>=0<=0) | C | true | HC | 5 | 1 | 1/2 |
|
||||
int8
|
||||
| hc1.nofrosttemp | nofrost temperature | int8 (>=0<=0) | C | true | HC | 18 | 1 | 1/2 |
|
||||
| hc1.control | control device | enum | | true | HC | 44 | 1 | 1 |
|
||||
| hc1.program | program | enum | | true | HC | 27 | 1 | 1 |
|
||||
| hc1.remotetemp | room temperature from remote | cmd | C | true | HC | 45 | 1 | 1/10 |
|
||||
| hc1.targetflowtemp | target flow temperature | uint8 | C | false | HC | 19 | 1 | 1 |
|
||||
@@ -7227,7 +7217,6 @@ uint8
|
||||
| hc1.ecotemp | eco temperature | uint8 (>=0<=0) | C | true | HC | 5 | 1 | 1/2 |
|
||||
int8
|
||||
| hc1.nofrosttemp | nofrost temperature | int8 (>=0<=0) | C | true | HC | 18 | 1 | 1/2 |
|
||||
| hc1.control | control device | enum | | true | HC | 44 | 1 | 1 |
|
||||
| hc1.program | program | enum | | true | HC | 27 | 1 | 1 |
|
||||
| hc1.remotetemp | room temperature from remote | cmd | C | true | HC | 45 | 1 | 1/10 |
|
||||
| hc1.targetflowtemp | target flow temperature | uint8 | C | false | HC | 19 | 1 | 1 |
|
||||
@@ -7286,7 +7275,6 @@ uint8
|
||||
| hc1.ecotemp | eco temperature | uint8 (>=0<=0) | C | true | HC | 5 | 1 | 1/2 |
|
||||
int8
|
||||
| hc1.nofrosttemp | nofrost temperature | int8 (>=0<=0) | C | true | HC | 18 | 1 | 1/2 |
|
||||
| hc1.control | control device | enum | | true | HC | 44 | 1 | 1 |
|
||||
| hc1.program | program | enum | | true | HC | 27 | 1 | 1 |
|
||||
| hc1.remotetemp | room temperature from remote | cmd | C | true | HC | 45 | 1 | 1/10 |
|
||||
| hc1.targetflowtemp | target flow temperature | uint8 | C | false | HC | 19 | 1 | 1 |
|
||||
@@ -7345,7 +7333,6 @@ uint8
|
||||
| hc1.ecotemp | eco temperature | uint8 (>=0<=0) | C | true | HC | 5 | 1 | 1/2 |
|
||||
int8
|
||||
| hc1.nofrosttemp | nofrost temperature | int8 (>=0<=0) | C | true | HC | 18 | 1 | 1/2 |
|
||||
| hc1.control | control device | enum | | true | HC | 44 | 1 | 1 |
|
||||
| hc1.program | program | enum | | true | HC | 27 | 1 | 1 |
|
||||
| hc1.remotetemp | room temperature from remote | cmd | C | true | HC | 45 | 1 | 1/10 |
|
||||
| hc1.targetflowtemp | target flow temperature | uint8 | C | false | HC | 19 | 1 | 1 |
|
||||
@@ -7406,7 +7393,6 @@ uint8
|
||||
| hc1.ecotemp | eco temperature | uint8 (>=0<=0) | C | true | HC | 5 | 1 | 1/2 |
|
||||
int8
|
||||
| hc1.nofrosttemp | nofrost temperature | int8 (>=0<=0) | C | true | HC | 18 | 1 | 1/2 |
|
||||
| hc1.control | control device | enum | | true | HC | 44 | 1 | 1 |
|
||||
| hc1.program | program | enum | | true | HC | 27 | 1 | 1 |
|
||||
| hc1.remotetemp | room temperature from remote | cmd | C | true | HC | 45 | 1 | 1/10 |
|
||||
| hc1.targetflowtemp | target flow temperature | uint8 | C | false | HC | 19 | 1 | 1 |
|
||||
|
||||
@@ -4436,7 +4436,6 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
||||
"RC200, CW100, CR120, CR50",thermostat,157,hc1.dewoffset,dew point offset,uint8 (>=2<=10),K,true,number.thermostat_hc1_dew_point_offset,number.thermostat_hc1_dewoffset,7,1,1,41,1
|
||||
"RC200, CW100, CR120, CR50",thermostat,157,hc1.roomtempdiff,room temp difference,uint8 (>=0<=0),K,true,number.thermostat_hc1_room_temp_difference,number.thermostat_hc1_roomtempdiff,7,1,1,42,1
|
||||
"RC200, CW100, CR120, CR50",thermostat,157,hc1.hpminflowtemp,HP min. flow temp.,uint8 (>=0<=0),C,true,number.thermostat_hc1_HP_min._flow_temp.,number.thermostat_hc1_hpminflowtemp,7,1,1,43,1
|
||||
"RC200, CW100, CR120, CR50",thermostat,157,hc1.control,control device,enum [RC310\|RC200\|RC100\|RC100H\|TC100] (>=0<=0), ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,7,1,1,44,1
|
||||
"RC200, CW100, CR120, CR50",thermostat,157,hc1.heatondelay,heat-on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-on_delay,number.thermostat_hc1_heatondelay,7,1,1,47,1
|
||||
"RC200, CW100, CR120, CR50",thermostat,157,hc1.heatoffdelay,heat-off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-off_delay,number.thermostat_hc1_heatoffdelay,7,1,1,48,1
|
||||
"RC200, CW100, CR120, CR50",thermostat,157,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,7,1,1,49,1
|
||||
@@ -4532,7 +4531,6 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
||||
"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.dewoffset,dew point offset,uint8 (>=2<=10),K,true,number.thermostat_hc1_dew_point_offset,number.thermostat_hc1_dewoffset,7,1,1,41,1
|
||||
"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.roomtempdiff,room temp difference,uint8 (>=0<=0),K,true,number.thermostat_hc1_room_temp_difference,number.thermostat_hc1_roomtempdiff,7,1,1,42,1
|
||||
"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.hpminflowtemp,HP min. flow temp.,uint8 (>=0<=0),C,true,number.thermostat_hc1_HP_min._flow_temp.,number.thermostat_hc1_hpminflowtemp,7,1,1,43,1
|
||||
"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.control,control device,enum [RC310\|RC200\|RC100\|RC100H\|TC100] (>=0<=0), ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,7,1,1,44,1
|
||||
"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,7,1,1/10,45,1
|
||||
"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.remotehum,room humidity from remote,cmd [] (>=-1<=101),%,true,sensor.thermostat_hc1_room_humidity_from_remote,sensor.thermostat_hc1_remotehum,7,1,1,46,1
|
||||
"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.heatondelay,heat-on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-on_delay,number.thermostat_hc1_heatondelay,7,1,1,47,1
|
||||
@@ -4639,7 +4637,6 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
||||
"Rego 2000/3000",thermostat,172,hc1.dewoffset,dew point offset,uint8 (>=2<=10),K,true,number.thermostat_hc1_dew_point_offset,number.thermostat_hc1_dewoffset,7,1,1,41,1
|
||||
"Rego 2000/3000",thermostat,172,hc1.roomtempdiff,room temp difference,uint8 (>=0<=0),K,true,number.thermostat_hc1_room_temp_difference,number.thermostat_hc1_roomtempdiff,7,1,1,42,1
|
||||
"Rego 2000/3000",thermostat,172,hc1.hpminflowtemp,HP min. flow temp.,uint8 (>=0<=0),C,true,number.thermostat_hc1_HP_min._flow_temp.,number.thermostat_hc1_hpminflowtemp,7,1,1,43,1
|
||||
"Rego 2000/3000",thermostat,172,hc1.control,control device,enum [RC310\|RC200\|RC100\|RC100H\|TC100] (>=0<=0), ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,7,1,1,44,1
|
||||
"Rego 2000/3000",thermostat,172,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,7,1,1/10,45,1
|
||||
"Rego 2000/3000",thermostat,172,hc1.remotehum,room humidity from remote,cmd [] (>=-1<=101),%,true,sensor.thermostat_hc1_room_humidity_from_remote,sensor.thermostat_hc1_remotehum,7,1,1,46,1
|
||||
"Rego 2000/3000",thermostat,172,hc1.heatondelay,heat-on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-on_delay,number.thermostat_hc1_heatondelay,7,1,1,47,1
|
||||
@@ -4983,7 +4980,6 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
||||
"FW100",thermostat,105,hc1.heattemp,heat temperature,uint8 (>=0<=0),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,7,1,1/2,205,1
|
||||
"FW100",thermostat,105,hc1.ecotemp,eco temperature,uint8 (>=0<=0),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,7,1,1/2,5,1
|
||||
"FW100",thermostat,105,hc1.nofrosttemp,nofrost temperature,int8 (>=0<=0),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,7,1,1/2,18,1
|
||||
"FW100",thermostat,105,hc1.control,control device,enum [off\|FB10\|FB100] (>=0<=0), ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,7,1,1,44,1
|
||||
"FW100",thermostat,105,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] (>=0<=0), ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,7,1,1,27,1
|
||||
"FW100",thermostat,105,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,7,1,1/10,45,1
|
||||
"FW100",thermostat,105,hc1.targetflowtemp,target flow temperature,uint8,C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,7,1,1,19,1
|
||||
@@ -5022,7 +5018,6 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
||||
"FW200",thermostat,106,hc1.heattemp,heat temperature,uint8 (>=0<=0),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,7,1,1/2,205,1
|
||||
"FW200",thermostat,106,hc1.ecotemp,eco temperature,uint8 (>=0<=0),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,7,1,1/2,5,1
|
||||
"FW200",thermostat,106,hc1.nofrosttemp,nofrost temperature,int8 (>=0<=0),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,7,1,1/2,18,1
|
||||
"FW200",thermostat,106,hc1.control,control device,enum [off\|FB10\|FB100] (>=0<=0), ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,7,1,1,44,1
|
||||
"FW200",thermostat,106,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] (>=0<=0), ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,7,1,1,27,1
|
||||
"FW200",thermostat,106,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,7,1,1/10,45,1
|
||||
"FW200",thermostat,106,hc1.targetflowtemp,target flow temperature,uint8,C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,7,1,1,19,1
|
||||
@@ -5059,7 +5054,6 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
||||
"FR100",thermostat,107,hc1.heattemp,heat temperature,uint8 (>=0<=0),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,7,1,1/2,205,1
|
||||
"FR100",thermostat,107,hc1.ecotemp,eco temperature,uint8 (>=0<=0),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,7,1,1/2,5,1
|
||||
"FR100",thermostat,107,hc1.nofrosttemp,nofrost temperature,int8 (>=0<=0),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,7,1,1/2,18,1
|
||||
"FR100",thermostat,107,hc1.control,control device,enum [off\|FB10\|FB100] (>=0<=0), ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,7,1,1,44,1
|
||||
"FR100",thermostat,107,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] (>=0<=0), ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,7,1,1,27,1
|
||||
"FR100",thermostat,107,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,7,1,1/10,45,1
|
||||
"FR100",thermostat,107,hc1.targetflowtemp,target flow temperature,uint8,C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,7,1,1,19,1
|
||||
@@ -5096,7 +5090,6 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
||||
"FR110",thermostat,108,hc1.heattemp,heat temperature,uint8 (>=0<=0),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,7,1,1/2,205,1
|
||||
"FR110",thermostat,108,hc1.ecotemp,eco temperature,uint8 (>=0<=0),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,7,1,1/2,5,1
|
||||
"FR110",thermostat,108,hc1.nofrosttemp,nofrost temperature,int8 (>=0<=0),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,7,1,1/2,18,1
|
||||
"FR110",thermostat,108,hc1.control,control device,enum [off\|FB10\|FB100] (>=0<=0), ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,7,1,1,44,1
|
||||
"FR110",thermostat,108,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] (>=0<=0), ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,7,1,1,27,1
|
||||
"FR110",thermostat,108,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,7,1,1/10,45,1
|
||||
"FR110",thermostat,108,hc1.targetflowtemp,target flow temperature,uint8,C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,7,1,1,19,1
|
||||
@@ -5135,7 +5128,6 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
||||
"FB10",thermostat,109,hc1.heattemp,heat temperature,uint8 (>=0<=0),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,7,1,1/2,205,1
|
||||
"FB10",thermostat,109,hc1.ecotemp,eco temperature,uint8 (>=0<=0),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,7,1,1/2,5,1
|
||||
"FB10",thermostat,109,hc1.nofrosttemp,nofrost temperature,int8 (>=0<=0),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,7,1,1/2,18,1
|
||||
"FB10",thermostat,109,hc1.control,control device,enum [off\|FB10\|FB100] (>=0<=0), ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,7,1,1,44,1
|
||||
"FB10",thermostat,109,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] (>=0<=0), ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,7,1,1,27,1
|
||||
"FB10",thermostat,109,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,7,1,1/10,45,1
|
||||
"FB10",thermostat,109,hc1.targetflowtemp,target flow temperature,uint8,C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,7,1,1,19,1
|
||||
@@ -5174,7 +5166,6 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
||||
"FB100",thermostat,110,hc1.heattemp,heat temperature,uint8 (>=0<=0),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,7,1,1/2,205,1
|
||||
"FB100",thermostat,110,hc1.ecotemp,eco temperature,uint8 (>=0<=0),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,7,1,1/2,5,1
|
||||
"FB100",thermostat,110,hc1.nofrosttemp,nofrost temperature,int8 (>=0<=0),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,7,1,1/2,18,1
|
||||
"FB100",thermostat,110,hc1.control,control device,enum [off\|FB10\|FB100] (>=0<=0), ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,7,1,1,44,1
|
||||
"FB100",thermostat,110,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] (>=0<=0), ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,7,1,1,27,1
|
||||
"FB100",thermostat,110,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,7,1,1/10,45,1
|
||||
"FB100",thermostat,110,hc1.targetflowtemp,target flow temperature,uint8,C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,7,1,1,19,1
|
||||
@@ -5211,7 +5202,6 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
||||
"FR10",thermostat,111,hc1.heattemp,heat temperature,uint8 (>=0<=0),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,7,1,1/2,205,1
|
||||
"FR10",thermostat,111,hc1.ecotemp,eco temperature,uint8 (>=0<=0),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,7,1,1/2,5,1
|
||||
"FR10",thermostat,111,hc1.nofrosttemp,nofrost temperature,int8 (>=0<=0),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,7,1,1/2,18,1
|
||||
"FR10",thermostat,111,hc1.control,control device,enum [off\|FB10\|FB100] (>=0<=0), ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,7,1,1,44,1
|
||||
"FR10",thermostat,111,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] (>=0<=0), ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,7,1,1,27,1
|
||||
"FR10",thermostat,111,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,7,1,1/10,45,1
|
||||
"FR10",thermostat,111,hc1.targetflowtemp,target flow temperature,uint8,C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,7,1,1,19,1
|
||||
@@ -5250,7 +5240,6 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
||||
"FW500",thermostat,116,hc1.heattemp,heat temperature,uint8 (>=0<=0),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,7,1,1/2,205,1
|
||||
"FW500",thermostat,116,hc1.ecotemp,eco temperature,uint8 (>=0<=0),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,7,1,1/2,5,1
|
||||
"FW500",thermostat,116,hc1.nofrosttemp,nofrost temperature,int8 (>=0<=0),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,7,1,1/2,18,1
|
||||
"FW500",thermostat,116,hc1.control,control device,enum [off\|FB10\|FB100] (>=0<=0), ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,7,1,1,44,1
|
||||
"FW500",thermostat,116,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] (>=0<=0), ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,7,1,1,27,1
|
||||
"FW500",thermostat,116,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,7,1,1/10,45,1
|
||||
"FW500",thermostat,116,hc1.targetflowtemp,target flow temperature,uint8,C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,7,1,1,19,1
|
||||
@@ -5287,7 +5276,6 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
||||
"FR50",thermostat,147,hc1.heattemp,heat temperature,uint8 (>=0<=0),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,7,1,1/2,205,1
|
||||
"FR50",thermostat,147,hc1.ecotemp,eco temperature,uint8 (>=0<=0),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,7,1,1/2,5,1
|
||||
"FR50",thermostat,147,hc1.nofrosttemp,nofrost temperature,int8 (>=0<=0),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,7,1,1/2,18,1
|
||||
"FR50",thermostat,147,hc1.control,control device,enum [off\|FB10\|FB100] (>=0<=0), ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,7,1,1,44,1
|
||||
"FR50",thermostat,147,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] (>=0<=0), ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,7,1,1,27,1
|
||||
"FR50",thermostat,147,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,7,1,1/10,45,1
|
||||
"FR50",thermostat,147,hc1.targetflowtemp,target flow temperature,uint8,C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,7,1,1,19,1
|
||||
@@ -5324,7 +5312,6 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
||||
"FR120",thermostat,191,hc1.heattemp,heat temperature,uint8 (>=0<=0),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,7,1,1/2,205,1
|
||||
"FR120",thermostat,191,hc1.ecotemp,eco temperature,uint8 (>=0<=0),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,7,1,1/2,5,1
|
||||
"FR120",thermostat,191,hc1.nofrosttemp,nofrost temperature,int8 (>=0<=0),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,7,1,1/2,18,1
|
||||
"FR120",thermostat,191,hc1.control,control device,enum [off\|FB10\|FB100] (>=0<=0), ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,7,1,1,44,1
|
||||
"FR120",thermostat,191,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] (>=0<=0), ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,7,1,1,27,1
|
||||
"FR120",thermostat,191,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,7,1,1/10,45,1
|
||||
"FR120",thermostat,191,hc1.targetflowtemp,target flow temperature,uint8,C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,7,1,1,19,1
|
||||
@@ -5363,7 +5350,6 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/
|
||||
"FW120",thermostat,192,hc1.heattemp,heat temperature,uint8 (>=0<=0),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,7,1,1/2,205,1
|
||||
"FW120",thermostat,192,hc1.ecotemp,eco temperature,uint8 (>=0<=0),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,7,1,1/2,5,1
|
||||
"FW120",thermostat,192,hc1.nofrosttemp,nofrost temperature,int8 (>=0<=0),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,7,1,1/2,18,1
|
||||
"FW120",thermostat,192,hc1.control,control device,enum [off\|FB10\|FB100] (>=0<=0), ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,7,1,1,44,1
|
||||
"FW120",thermostat,192,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] (>=0<=0), ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,7,1,1,27,1
|
||||
"FW120",thermostat,192,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,7,1,1/10,45,1
|
||||
"FW120",thermostat,192,hc1.targetflowtemp,target flow temperature,uint8,C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,7,1,1,19,1
|
||||
|
||||
|
Can't render this file because it is too large.
|
@@ -26,8 +26,8 @@
|
||||
"@alova/adapter-xhr": "2.3.1",
|
||||
"@emotion/react": "^11.14.0",
|
||||
"@emotion/styled": "^11.14.1",
|
||||
"@mui/icons-material": "^9.2.0",
|
||||
"@mui/material": "^9.2.0",
|
||||
"@mui/icons-material": "^9.3.0",
|
||||
"@mui/material": "^9.3.0",
|
||||
"@table-library/react-table-library": "4.1.15",
|
||||
"alova": "^3.5.3",
|
||||
"jwt-decode": "^4.0.0",
|
||||
@@ -52,11 +52,11 @@
|
||||
"mime-types": "^3.0.2",
|
||||
"prettier": "^3.9.6",
|
||||
"rollup-plugin-visualizer": "^7.0.1",
|
||||
"terser": "^5.49.0",
|
||||
"terser": "^5.49.1",
|
||||
"typescript": "^6.0.3",
|
||||
"typescript-eslint": "^8.65.0",
|
||||
"typescript-eslint": "^8.66.0",
|
||||
"vite": "^8.2.0",
|
||||
"vite-plugin-imagemin": "^0.6.1"
|
||||
},
|
||||
"packageManager": "pnpm@11.18.0+sha512.33d83c77da82f49fba836925c6f1b841181ec3132b670639bd012f7075f5c7cf634c5f870147c19aae7478fac01df09d8892e880454896edd23ee9b33757563c"
|
||||
"packageManager": "pnpm@11.20.0+sha512.9a6f330a95b66446ea088faf1521405a8a01f07fde7124cc9958dfed52d4bb436737e65b08f85f37b46fcba375092558ac51262b816844b22f63406ed166bfee"
|
||||
}
|
||||
|
||||
Generated
+202
-307
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 2.4 KiB |
+21
-17
@@ -2,6 +2,7 @@ import preact from '@preact/preset-vite';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import { visualizer } from 'rollup-plugin-visualizer';
|
||||
import { pathToFileURL } from 'url';
|
||||
import { Plugin, PluginOption, defineConfig } from 'vite';
|
||||
import viteImagemin from 'vite-plugin-imagemin';
|
||||
import zlib from 'zlib';
|
||||
@@ -178,24 +179,20 @@ const createProductionTerserOptions = () => ({
|
||||
toplevel: true
|
||||
});
|
||||
|
||||
// Image optimization plugin
|
||||
// Image optimization plugin.
|
||||
// Only svgo runs here: the raster optimizers (optipng, pngquant, gifsicle,
|
||||
// jpegtran, mozjpeg) are native binaries whose install scripts are blocked by
|
||||
// `allowBuilds` in pnpm-workspace.yaml, so they would fail on every build.
|
||||
// Raster assets are committed pre-optimized instead.
|
||||
const imageOptimizationPlugin = {
|
||||
...viteImagemin({
|
||||
verbose: false,
|
||||
gifsicle: {
|
||||
optimizationLevel: 7,
|
||||
interlaced: false
|
||||
},
|
||||
optipng: {
|
||||
optimizationLevel: 7
|
||||
},
|
||||
mozjpeg: {
|
||||
quality: 20
|
||||
},
|
||||
pngquant: {
|
||||
quality: [0.8, 0.9],
|
||||
speed: 4
|
||||
},
|
||||
filter: /\.svg$/i,
|
||||
gifsicle: false,
|
||||
jpegTran: false,
|
||||
mozjpeg: false,
|
||||
optipng: false,
|
||||
pngquant: false,
|
||||
svgo: {
|
||||
plugins: [
|
||||
{ name: 'removeViewBox' },
|
||||
@@ -210,8 +207,15 @@ export default defineConfig(
|
||||
async ({ command, mode }: { command: string; mode: string }) => {
|
||||
if (command === 'serve') {
|
||||
console.log(`Preparing for standalone build with server, mode=${mode}`);
|
||||
// @ts-expect-error - mock server doesn't have type declarations
|
||||
const { default: mockServer } = await import('../mock-api/mockServer.js');
|
||||
// Imported through a computed URL so the config bundler leaves it as a real
|
||||
// runtime import: mock-api is a separate package with its own node_modules,
|
||||
// and inlining it here would drag its dependencies into every build.
|
||||
const mockServerUrl = pathToFileURL(
|
||||
path.resolve(import.meta.dirname, '../mock-api/mockServer.js')
|
||||
).href;
|
||||
const { default: mockServer } = (await import(
|
||||
/* @vite-ignore */ mockServerUrl
|
||||
)) as { default: () => PluginOption };
|
||||
return {
|
||||
plugins: [...createBasePlugins(true, true), mockServer()],
|
||||
resolve: {
|
||||
|
||||
@@ -18,5 +18,5 @@
|
||||
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
|
||||
"prettier": "^3.9.6"
|
||||
},
|
||||
"packageManager": "pnpm@11.18.0+sha512.33d83c77da82f49fba836925c6f1b841181ec3132b670639bd012f7075f5c7cf634c5f870147c19aae7478fac01df09d8892e880454896edd23ee9b33757563c"
|
||||
"packageManager": "pnpm@11.20.0+sha512.9a6f330a95b66446ea088faf1521405a8a01f07fde7124cc9958dfed52d4bb436737e65b08f85f37b46fcba375092558ac51262b816844b22f63406ed166bfee"
|
||||
}
|
||||
|
||||
@@ -77,13 +77,15 @@ void NTPSettings::read(NTPSettings & settings, JsonObject root) {
|
||||
root["enabled"] = settings.enabled;
|
||||
root["server"] = settings.server;
|
||||
root["tz_label"] = settings.tzLabel;
|
||||
root["tz_format"] = settings.tzFormat;
|
||||
root["tz_format"] = settings.tzFormat.substring(0, settings.tzFormat.indexOf(" "));
|
||||
root["thermostat_sync"] = settings.thermostat_sync;
|
||||
root["tz_label_t"] = settings.tzLabelT;
|
||||
root["tz_format_t"] = settings.tzFormatT;
|
||||
root["tz_format_t"] = settings.tzFormatT.substring(0, settings.tzFormatT.indexOf(" "));
|
||||
}
|
||||
|
||||
StateUpdateResult NTPSettings::update(JsonObject root, NTPSettings & settings) {
|
||||
settings.tzFormat.reserve(40);
|
||||
settings.tzFormatT.reserve(40);
|
||||
settings.enabled = root["enabled"] | FACTORY_NTP_ENABLED;
|
||||
settings.server = root["server"] | FACTORY_NTP_SERVER;
|
||||
settings.tzLabel = root["tz_label"] | FACTORY_NTP_TIME_ZONE_LABEL;
|
||||
@@ -91,5 +93,12 @@ StateUpdateResult NTPSettings::update(JsonObject root, NTPSettings & settings) {
|
||||
settings.thermostat_sync = root["thermostat_sync"] | FACTORY_NTP_THERMOSTAT_SYNC;
|
||||
settings.tzLabelT = root["tz_label_t"] | FACTORY_NTP_TIME_ZONE_LABEL;
|
||||
settings.tzFormatT = root["tz_format_t"] | FACTORY_NTP_TIME_ZONE_FORMAT;
|
||||
// The format string must have same length to avoid memory leak, #3184
|
||||
while (settings.tzFormat.length() < 40) {
|
||||
settings.tzFormat += " ";
|
||||
}
|
||||
while (settings.tzFormatT.length() < 40) {
|
||||
settings.tzFormatT += " ";
|
||||
}
|
||||
return StateUpdateResult::CHANGED;
|
||||
}
|
||||
|
||||
@@ -102,7 +102,7 @@ void AnalogSensor::start(const bool factory_settings) {
|
||||
Command::add(
|
||||
EMSdevice::DeviceType::ANALOGSENSOR,
|
||||
F_(setvalue),
|
||||
[&](const char * value, const int8_t id, JsonObject output) { return command_setvalue(value, id); },
|
||||
[&](const char * value, const int8_t id, JsonObject) { return command_setvalue(value, id); },
|
||||
FL_(setiovalue_cmd),
|
||||
CommandFlag::ADMIN_ONLY);
|
||||
|
||||
@@ -195,7 +195,7 @@ void AnalogSensor::reload(bool get_nvs) {
|
||||
Command::add(
|
||||
EMSdevice::DeviceType::ANALOGSENSOR,
|
||||
sensor.name,
|
||||
[&](const char * value, const int8_t id, JsonObject output) { return command_setvalue(value, sensor.gpio); },
|
||||
[&](const char * value, const int8_t, JsonObject) { return command_setvalue(value, sensor.gpio); },
|
||||
sensor.type == AnalogType::COUNTER || (sensor.type >= AnalogType::CNT_0 && sensor.type <= AnalogType::CNT_2) ? FL_(counter)
|
||||
: sensor.type == AnalogType::DIGITAL_OUT ? FL_(digital_out)
|
||||
: sensor.type == AnalogType::RGB ? FL_(RGB)
|
||||
|
||||
@@ -104,7 +104,7 @@ static void setup_commands(std::shared_ptr<Commands> const & commands) {
|
||||
shell.printfln("Unknown show command");
|
||||
}
|
||||
},
|
||||
[](Shell const & shell, const std::vector<std::string> & current_arguments, const std::string & next_argument) -> std::vector<std::string> {
|
||||
[](Shell const &, const std::vector<std::string> &, const std::string &) -> std::vector<std::string> {
|
||||
return std::vector<std::string>{"system", "users", "devices", "log", "ems", "values", "mqtt", "commands"};
|
||||
});
|
||||
|
||||
@@ -191,7 +191,7 @@ static void setup_commands(std::shared_ptr<Commands> const & commands) {
|
||||
CommandFlags::ADMIN,
|
||||
{F_(restart)},
|
||||
{F_(partitionname_optional)},
|
||||
[](Shell & shell, const std::vector<std::string> & arguments) {
|
||||
[](Shell &, const std::vector<std::string> & arguments) {
|
||||
if (arguments.size()) {
|
||||
EMSESP::system_.system_restart(arguments.front().c_str());
|
||||
} else {
|
||||
@@ -202,7 +202,7 @@ static void setup_commands(std::shared_ptr<Commands> const & commands) {
|
||||
commands->add_command(ShellContext::MAIN,
|
||||
CommandFlags::ADMIN,
|
||||
string_vector{F_(wifi), F_(reconnect)},
|
||||
[](Shell & shell, const std::vector<std::string> & arguments) { EMSESP::network_.reconnect(); });
|
||||
[](Shell &, const std::vector<std::string> &) { EMSESP::network_.reconnect(); });
|
||||
|
||||
//
|
||||
// SET commands
|
||||
@@ -244,7 +244,7 @@ static void setup_commands(std::shared_ptr<Commands> const & commands) {
|
||||
commands->add_command(ShellContext::MAIN,
|
||||
CommandFlags::ADMIN,
|
||||
string_vector{F_(set), F_(wifi), F_(password)},
|
||||
[](Shell & shell, const std::vector<std::string> & arguments) {
|
||||
[](Shell & shell, const std::vector<std::string> &) {
|
||||
shell.enter_password(F_(new_password_prompt1), [](Shell & shell, bool completed, const std::string & password1) {
|
||||
if (completed) {
|
||||
shell.enter_password(F_(new_password_prompt2), [password1](Shell & shell, bool completed, const std::string & password2) {
|
||||
@@ -367,7 +367,7 @@ static void setup_commands(std::shared_ptr<Commands> const & commands) {
|
||||
// EMS device commands
|
||||
//
|
||||
|
||||
commands->add_command(ShellContext::MAIN, CommandFlags::ADMIN, {F_(scan)}, [](Shell & shell, const std::vector<std::string> & arguments) {
|
||||
commands->add_command(ShellContext::MAIN, CommandFlags::ADMIN, {F_(scan)}, [](Shell &, const std::vector<std::string> &) {
|
||||
EMSESP::scan_devices();
|
||||
});
|
||||
|
||||
|
||||
@@ -693,6 +693,10 @@ void EMSdevice::erase_device_values() {
|
||||
}
|
||||
}
|
||||
devicevalues_.clear();
|
||||
telegram_functions_.clear();
|
||||
handlers_ignored_.clear();
|
||||
handlers_config_.clear();
|
||||
handlers_broadcasted_.clear();
|
||||
}
|
||||
|
||||
// single list of options
|
||||
|
||||
+30
-5
@@ -173,12 +173,25 @@ uint8_t EMSESP::device_id_from_cmd(const uint8_t device_type, const char * cmd,
|
||||
return 0;
|
||||
}
|
||||
|
||||
// clears list of recognized devices
|
||||
void EMSESP::clear_all_devices() {
|
||||
// temporarily removed: clearing the list causes a crash, the associated commands and mqtt should also be removed.
|
||||
// emsdevices.clear(); // remove entries, but doesn't delete actual devices
|
||||
// remove a single device with all it's entities, commands, and telegrams
|
||||
void EMSESP::erase_device(const uint8_t type_id) {
|
||||
for (auto it = emsdevices.begin(); it < emsdevices.end(); it++) {
|
||||
if ((*it)->device_id() == type_id) {
|
||||
(*it)->erase_device_values();
|
||||
emsdevices.erase(it);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// clears list of recognized devices, entities and telegrams
|
||||
void EMSESP::clear_all_devices() {
|
||||
for (auto & emsdevice : emsdevices) {
|
||||
emsdevice->erase_device_values();
|
||||
}
|
||||
emsdevices.clear();
|
||||
}
|
||||
|
||||
// called from EMSdevice/Command whenever an entity or telegram handler is registered.
|
||||
// Devices reserve their value/telegram vectors generously (to avoid realloc storms while
|
||||
// heating circuits etc. are discovered incrementally), so once registration settles we
|
||||
@@ -1027,10 +1040,13 @@ void EMSESP::process_UBADevices(const std::shared_ptr<const Telegram> & telegram
|
||||
if (next_byte & 0x01) {
|
||||
// if we haven't already detected this device, request it's version details, unless its us (EMS-ESP)
|
||||
// when the version info is received, it will automagically add the device
|
||||
if ((device_id != EMSbus::ems_bus_id()) && !(EMSESP::device_exists(device_id))) {
|
||||
if ((device_id != EMSbus::ems_bus_id()) && !(device_exists(device_id))) {
|
||||
LOG_DEBUG("New EMS device detected with ID 0x%02X. Requesting version information.", device_id);
|
||||
send_read_request(EMSdevice::EMS_TYPE_VERSION, device_id);
|
||||
}
|
||||
} else if (device_exists(device_id) && !device_hasEntities(device_id)) {
|
||||
LOG_DEBUG("Remove EMS device with ID 0x%02X", device_id);
|
||||
erase_device(device_id); //
|
||||
}
|
||||
next_byte = next_byte >> 1; // advance 1 bit
|
||||
}
|
||||
@@ -1237,6 +1253,15 @@ bool EMSESP::process_telegram(const std::shared_ptr<const Telegram> & telegram)
|
||||
return telegram_found;
|
||||
}
|
||||
|
||||
bool EMSESP::device_hasEntities(const uint8_t device_id) {
|
||||
for (const auto & emsdevice : emsdevices) {
|
||||
if (emsdevice->is_device_id(device_id) && (emsdevice->count_entities() > 0)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false; // not found
|
||||
}
|
||||
|
||||
// return true if we have this device already registered
|
||||
bool EMSESP::device_exists(const uint8_t device_id) {
|
||||
if (emsdevices.empty()) {
|
||||
|
||||
@@ -152,6 +152,7 @@ class EMSESP {
|
||||
static void send_write_request(const uint16_t type_id, const uint8_t dest, const uint8_t offset, const uint8_t value);
|
||||
static void send_write_request(const uint16_t type_id, const uint8_t dest, const uint8_t offset, const uint8_t value, const uint16_t validate_typeid);
|
||||
|
||||
static bool device_hasEntities(const uint8_t device_id);
|
||||
static bool device_exists(const uint8_t device_id);
|
||||
static void device_active(const uint8_t device_id, const bool active);
|
||||
static bool cmd_is_readonly(const uint8_t device_type, const uint8_t device_id, const char * cmd, const int8_t id);
|
||||
@@ -238,6 +239,7 @@ class EMSESP {
|
||||
|
||||
static bool add_device(const uint8_t device_id, const uint8_t product_id, const char * version, const uint8_t brand);
|
||||
static void scan_devices();
|
||||
static void erase_device(const uint8_t type_id);
|
||||
static void clear_all_devices();
|
||||
|
||||
// called whenever a device entity or telegram handler is registered, so we can
|
||||
|
||||
+20
-4
@@ -59,11 +59,16 @@ bool LED::loop(uint8_t healthcheck, bool button_busy) {
|
||||
// the user-requested LED blink always has preference
|
||||
if (!is_user_led_blink_) {
|
||||
// check for button press.
|
||||
// if button is pressed, show LED (yellow on RGB LED, on/off on standard LED)
|
||||
// it will turn off on the next loop cycle
|
||||
// while the button is held show the LED (yellow on RGB LED, on/off on standard LED),
|
||||
// and on release go back to the default state and re-check the health on the next cycle
|
||||
if (last_button_busy_ != button_busy) {
|
||||
last_button_busy_ = button_busy;
|
||||
set_led(button_busy ? Color::OFF : Color::YELLOW); // Yellow
|
||||
if (button_busy) {
|
||||
set_led(Color::YELLOW); // Yellow
|
||||
} else {
|
||||
reset_led();
|
||||
previous_healthcheck_ = System::HEALTHCHECK_RESET;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -104,6 +109,12 @@ bool LED::loop(uint8_t healthcheck, bool button_busy) {
|
||||
color_steps_[2] = Color::BLUE; // blue, no network and no bus
|
||||
}
|
||||
}
|
||||
|
||||
// there's nothing to flash, so leave the LED in the state reset_led() gave it.
|
||||
// Running the sequence here would keep writing Color::OFF and a healthy system would never show green.
|
||||
if (healthcheck == 0 || button_busy) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// show the LED status based on the healthcheck and button busy status
|
||||
@@ -119,6 +130,11 @@ void LED::reset_led() {
|
||||
color_steps_[0] = Color::OFF;
|
||||
color_steps_[1] = Color::OFF;
|
||||
color_steps_[2] = Color::OFF;
|
||||
|
||||
// rewind the sequence so it starts from the top if the health degrades again
|
||||
led_long_timer_ = 1; // 1 will kick it off immediately
|
||||
led_short_timer_ = 0;
|
||||
led_flash_step_ = 0;
|
||||
}
|
||||
|
||||
// LED flash every few ms and then perform a factory reset
|
||||
@@ -313,4 +329,4 @@ void LED::start_led_fast_flash(uint8_t duration) {
|
||||
led_fast_flash_timer_ = true; // it's active
|
||||
}
|
||||
|
||||
} // namespace emsesp
|
||||
} // namespace emsesp
|
||||
+21
-4
@@ -82,7 +82,13 @@ void Network::begin() {
|
||||
WiFi.persistent(false);
|
||||
WiFi.setAutoReconnect(false);
|
||||
WiFi.mode(WIFI_STA);
|
||||
WiFi.disconnect(true, true); // wipe old settings in NVS. Will give a warning on boot but can be ignored.
|
||||
|
||||
if (WiFi.STA.started()) {
|
||||
WiFi.disconnect(true, true); // wipe old settings; only when STA is up
|
||||
} else {
|
||||
WiFi.disconnect(true, false); // disconnect/off without erase, so no warning is shown
|
||||
}
|
||||
|
||||
WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN);
|
||||
WiFi.setHostname(hostname_.c_str()); // updates shared default_hostname buffer
|
||||
WiFi.enableSTA(true); // creates the STA netif
|
||||
@@ -152,7 +158,7 @@ void Network::begin() {
|
||||
}
|
||||
|
||||
// format the BSSID (MAC address) of the network interface
|
||||
bool Network::formatBSSID(const String & bssid, uint8_t (&mac)[6]) {
|
||||
bool Network::formatBSSID([[maybe_unused]] const String & bssid, [[maybe_unused]] uint8_t (&mac)[6]) {
|
||||
#ifndef EMSESP_STANDALONE
|
||||
uint tmp[6];
|
||||
if (bssid.isEmpty() || sscanf(bssid.c_str(), "%X:%X:%X:%X:%X:%X", &tmp[0], &tmp[1], &tmp[2], &tmp[3], &tmp[4], &tmp[5]) != 6) {
|
||||
@@ -331,7 +337,7 @@ void Network::checkConnection() {
|
||||
// 802.11ac - wifi5
|
||||
// 802.11ax - wifi6
|
||||
// tx_power is the Tx power to set, 0 for auto
|
||||
void Network::setWiFiPower(uint8_t tx_power) {
|
||||
void Network::setWiFiPower([[maybe_unused]] uint8_t tx_power) {
|
||||
#ifndef EMSESP_STANDALONE
|
||||
if (tx_power != 0) {
|
||||
if (!WiFi.setTxPower(static_cast<wifi_power_t>(tx_power))) {
|
||||
@@ -413,7 +419,7 @@ void Network::startmDNS() const {
|
||||
}
|
||||
|
||||
// WiFi disconnect reason code to string
|
||||
const char * Network::disconnectReason(uint8_t code) {
|
||||
const char * Network::disconnectReason([[maybe_unused]] uint8_t code) {
|
||||
#ifndef EMSESP_STANDALONE
|
||||
switch (code) {
|
||||
case WIFI_REASON_UNSPECIFIED: // = 1,
|
||||
@@ -539,6 +545,17 @@ void Network::startEthernet() {
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
// The Tasmota SDK is built with CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=2, so the Ethernet MAC is derived as
|
||||
// a locally-administered address from base+1 instead of the universal base+3 that Arduino Core 2 used.
|
||||
// Seed the MAC table with the old value before the EMAC driver reads it, so DHCP reservations survive an upgrade.
|
||||
uint8_t eth_mac[6];
|
||||
if (esp_read_mac(eth_mac, ESP_MAC_BASE) == ESP_OK) {
|
||||
eth_mac[5] += 3;
|
||||
esp_iface_mac_addr_set(eth_mac, ESP_MAC_ETH);
|
||||
}
|
||||
*/
|
||||
|
||||
// reset power and add a delay as ETH doesn't not always start up correctly after a warm boot
|
||||
if (eth_power_ != -1) {
|
||||
pinMode(eth_power_, OUTPUT);
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#define EMSESP_NETWORK_H_
|
||||
|
||||
#ifndef EMSESP_STANDALONE
|
||||
#include <esp_mac.h>
|
||||
#include <esp_wifi.h>
|
||||
#include <ETH.h>
|
||||
#include <WiFi.h>
|
||||
|
||||
+26
-13
@@ -93,6 +93,20 @@ uint32_t System::min_free_mem_;
|
||||
std::vector<uint8_t, AllocatorPSRAM<uint8_t>> System::valid_system_gpios_;
|
||||
std::vector<System::GpioUsage, AllocatorPSRAM<System::GpioUsage>> System::used_gpios_;
|
||||
|
||||
#ifndef EMSESP_STANDALONE
|
||||
// The DNS slots are shared between IPv4 and IPv6, so with IPv6 enabled the first slot can hold an
|
||||
// IPv6 server. Pick the first IPv4 one so it matches the label we print it under.
|
||||
static IPAddress dns_ipv4(const NetworkInterface & netif) {
|
||||
for (uint8_t i = 0; i < ESP_NETIF_DNS_MAX; i++) {
|
||||
IPAddress ip = netif.dnsIP(i);
|
||||
if (ip.type() == IPv4 && static_cast<uint32_t>(ip) != 0) {
|
||||
return ip;
|
||||
}
|
||||
}
|
||||
return IPAddress();
|
||||
}
|
||||
#endif
|
||||
|
||||
// find the index of the language
|
||||
// 0 = EN, 1 = DE, etc...
|
||||
uint8_t System::language_index() {
|
||||
@@ -110,7 +124,7 @@ bool System::command_send(const char * value, const int8_t id) {
|
||||
}
|
||||
|
||||
// send email via SMTP
|
||||
bool System::command_sendmail(const char * value, const int8_t id) {
|
||||
bool System::command_sendmail(const char * value, const int8_t) {
|
||||
bool enabled = false;
|
||||
uint8_t security;
|
||||
uint16_t port;
|
||||
@@ -487,7 +501,7 @@ void System::set_partition_install_date() {
|
||||
}
|
||||
|
||||
// sets the partition to use on the next restart
|
||||
bool System::set_partition(const char * partitionname) {
|
||||
bool System::set_partition([[maybe_unused]] const char * partitionname) {
|
||||
#ifdef EMSESP_STANDALONE
|
||||
return true;
|
||||
#else
|
||||
@@ -858,8 +872,7 @@ void System::send_info_mqtt() {
|
||||
doc["MAC"] = WiFi.macAddress();
|
||||
doc["IPv4 address"] = uuid::printable_to_string(WiFi.localIP()) + "/" + uuid::printable_to_string(WiFi.subnetMask());
|
||||
doc["IPv4 gateway"] = uuid::printable_to_string(WiFi.gatewayIP());
|
||||
doc["IPv4 nameserver"] = uuid::printable_to_string(WiFi.dnsIP());
|
||||
|
||||
doc["IPv4 DNS Server"] = uuid::printable_to_string(dns_ipv4(WiFi.STA));
|
||||
if (WiFi.linkLocalIPv6().toString() != "0000:0000:0000:0000:0000:0000:0000:0000" && WiFi.linkLocalIPv6().toString() != "::") {
|
||||
doc["IPv6 address"] = uuid::printable_to_string(WiFi.linkLocalIPv6());
|
||||
}
|
||||
@@ -1168,7 +1181,7 @@ void System::show_system(uuid::console::Shell & shell) {
|
||||
shell.printfln(" Hostname: %s", WiFi.getHostname());
|
||||
shell.printfln(" IPv4 address: %s/%s", uuid::printable_to_string(WiFi.localIP()).c_str(), uuid::printable_to_string(WiFi.subnetMask()).c_str());
|
||||
shell.printfln(" IPv4 gateway: %s", uuid::printable_to_string(WiFi.gatewayIP()).c_str());
|
||||
shell.printfln(" IPv4 nameserver: %s", uuid::printable_to_string(WiFi.dnsIP()).c_str());
|
||||
shell.printfln(" IPv4 DNS Server: %s", uuid::printable_to_string(dns_ipv4(WiFi.STA)).c_str());
|
||||
if (WiFi.linkLocalIPv6().toString() != "0000:0000:0000:0000:0000:0000:0000:0000" && WiFi.linkLocalIPv6().toString() != "::") {
|
||||
shell.printfln(" IPv6 address: %s", uuid::printable_to_string(WiFi.linkLocalIPv6()).c_str());
|
||||
}
|
||||
@@ -1201,7 +1214,7 @@ void System::show_system(uuid::console::Shell & shell) {
|
||||
shell.printfln(" Hostname: %s", ETH.getHostname());
|
||||
shell.printfln(" IPv4 address: %s/%s", uuid::printable_to_string(ETH.localIP()).c_str(), uuid::printable_to_string(ETH.subnetMask()).c_str());
|
||||
shell.printfln(" IPv4 gateway: %s", uuid::printable_to_string(ETH.gatewayIP()).c_str());
|
||||
shell.printfln(" IPv4 nameserver: %s", uuid::printable_to_string(ETH.dnsIP()).c_str());
|
||||
shell.printfln(" IPv4 DNS Server: %s", uuid::printable_to_string(dns_ipv4(ETH)).c_str());
|
||||
if (ETH.linkLocalIPv6().toString() != "0000:0000:0000:0000:0000:0000:0000:0000" && ETH.linkLocalIPv6().toString() != "::") {
|
||||
shell.printfln(" IPv6 address: %s", uuid::printable_to_string(ETH.linkLocalIPv6()).c_str());
|
||||
}
|
||||
@@ -1694,7 +1707,7 @@ static const std::pair<const char *, const char *> SECTION_MAP[] = {
|
||||
#endif
|
||||
|
||||
// convert a single config file into a section of the output json object
|
||||
void System::exportSettings(const std::string & type, const char * filename, JsonObject output) {
|
||||
void System::exportSettings(const std::string & type, [[maybe_unused]] const char * filename, JsonObject output) {
|
||||
if (type != "settings") {
|
||||
output["type"] = type; // add the type to the output, not for settings as it's already added because its grouped
|
||||
}
|
||||
@@ -1849,7 +1862,7 @@ void System::exportSystemBackup(JsonObject output) {
|
||||
}
|
||||
|
||||
// write a settings file using input from a json object, called from upload/restore
|
||||
bool System::saveSettings(const char * filename, JsonObject input) {
|
||||
bool System::saveSettings([[maybe_unused]] const char * filename, [[maybe_unused]] JsonObject input) {
|
||||
#ifndef EMSESP_STANDALONE
|
||||
const char * section = nullptr;
|
||||
for (const auto & [f, label] : SECTION_MAP) {
|
||||
@@ -2819,7 +2832,7 @@ bool System::load_board_profile(std::vector<int8_t> & data, const std::string &
|
||||
// rgb for RGB
|
||||
// For example: /api/system/led?data=red:blink1
|
||||
// For older non-RGB models, the colour would default to just being on.
|
||||
bool System::command_led(const char * value, const int8_t id) {
|
||||
bool System::command_led(const char * value, const int8_t) {
|
||||
if (!value) {
|
||||
return false; // no argument
|
||||
}
|
||||
@@ -2842,7 +2855,7 @@ bool System::command_led(const char * value, const int8_t id) {
|
||||
}
|
||||
|
||||
// txpause command - temporarily pause the TX, by setting Txmode to 0 (disabled)
|
||||
bool System::command_txpause(const char * value, const int8_t id) {
|
||||
bool System::command_txpause(const char * value, const int8_t) {
|
||||
bool arg;
|
||||
if (!Helpers::value2bool(value, arg)) {
|
||||
return false; // argument not recognized
|
||||
@@ -2985,7 +2998,7 @@ bool System::ntp_connected() {
|
||||
}
|
||||
|
||||
// see if its a BBQKees Gateway by checking the eFuse values
|
||||
String System::getBBQKeesGatewayDetails(uint8_t detail) {
|
||||
String System::getBBQKeesGatewayDetails([[maybe_unused]] uint8_t detail) {
|
||||
#ifndef EMSESP_STANDALONE
|
||||
union {
|
||||
struct {
|
||||
@@ -3401,7 +3414,7 @@ bool System::readCommand(const char * data) {
|
||||
}
|
||||
|
||||
// system read command
|
||||
bool System::command_read(const char * value, const int8_t id) {
|
||||
bool System::command_read(const char * value, const int8_t) {
|
||||
return readCommand(value);
|
||||
}
|
||||
|
||||
@@ -3696,7 +3709,7 @@ void System::restore_snapshot_gpios(std::vector<int8_t> & u_gpios, std::vector<i
|
||||
}
|
||||
|
||||
// show the contents of a directory in the LittleFS filesystem
|
||||
void System::listDir(const char * dirname, uint8_t levels) {
|
||||
void System::listDir([[maybe_unused]] const char * dirname, [[maybe_unused]] uint8_t levels) {
|
||||
#if defined(EMSESP_DEBUG)
|
||||
#ifndef EMSESP_STANDALONE
|
||||
|
||||
|
||||
+13
-13
@@ -1822,7 +1822,7 @@ void Boiler::process_HpPool(const std::shared_ptr<const Telegram> & telegram) {
|
||||
// Boiler(0x08) -> All(0x00), ?(0x04A2), data: 02 01 01 00 01 00
|
||||
// Boiler(0x08) -W-> Me(0x0B), HpInput(0x04A2), data: 20 07 06 01 00 (from #802)
|
||||
// see https://github.com/emsesp/EMS-ESP32/issues/2844#issuecomment-3689049155
|
||||
void Boiler::process_HpInput(const std::shared_ptr<const Telegram> & telegram) {
|
||||
void Boiler::process_HpInput(const std::shared_ptr<const Telegram> &) {
|
||||
}
|
||||
|
||||
// Heatpump inputs settings- type 0x486 (https://github.com/emsesp/EMS-ESP32/issues/600)
|
||||
@@ -1923,7 +1923,7 @@ void Boiler::process_UBASetPoints2(const std::shared_ptr<const Telegram> & teleg
|
||||
}
|
||||
|
||||
// 0x35 - not yet implemented, not readable, only for settings
|
||||
void Boiler::process_UBAFlags(const std::shared_ptr<const Telegram> & telegram) {
|
||||
void Boiler::process_UBAFlags(const std::shared_ptr<const Telegram> &) {
|
||||
}
|
||||
|
||||
// 0x1C
|
||||
@@ -1942,7 +1942,7 @@ void Boiler::process_UBAMaintenanceStatus(const std::shared_ptr<const Telegram>
|
||||
}
|
||||
|
||||
// 0xBF
|
||||
void Boiler::process_ErrorMessage(const std::shared_ptr<const Telegram> & telegram) {
|
||||
void Boiler::process_ErrorMessage(const std::shared_ptr<const Telegram> &) {
|
||||
EMSESP::send_read_request(0xC2, device_id(), 0, 20); // read last errorcode
|
||||
EMSESP::send_read_request(0xC6, device_id(), 0, 21); // read last errorcode
|
||||
}
|
||||
@@ -2494,7 +2494,7 @@ bool Boiler::set_ww_disinfect_temp(const char * value, const int8_t id) {
|
||||
}
|
||||
|
||||
// Set the dhw priority
|
||||
bool Boiler::set_ww_prio(const char * value, const int8_t id) {
|
||||
bool Boiler::set_ww_prio(const char * value, const int8_t) {
|
||||
bool b;
|
||||
if (!Helpers::value2bool(value, b)) {
|
||||
return false;
|
||||
@@ -2814,7 +2814,7 @@ bool Boiler::set_pump_delay(const char * value, const int8_t id) {
|
||||
}
|
||||
|
||||
// set pump logic temperature
|
||||
bool Boiler::set_pumpOnTemp(const char * value, const int8_t id) {
|
||||
bool Boiler::set_pumpOnTemp(const char * value, const int8_t) {
|
||||
int v;
|
||||
if (!Helpers::value2temperature(value, v)) {
|
||||
return false;
|
||||
@@ -3037,7 +3037,7 @@ bool Boiler::set_reset(const char * value, const int8_t id) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Boiler::set_manDefrost(const char * value, const int8_t id) {
|
||||
bool Boiler::set_manDefrost(const char * value, const int8_t) {
|
||||
bool b;
|
||||
if (!Helpers::value2bool(value, b)) {
|
||||
return false;
|
||||
@@ -3046,7 +3046,7 @@ bool Boiler::set_manDefrost(const char * value, const int8_t id) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Boiler::set_chimneysweeper(const char * value, const int8_t id) {
|
||||
bool Boiler::set_chimneysweeper(const char * value, const int8_t) {
|
||||
bool b;
|
||||
if (!Helpers::value2bool(value, b)) {
|
||||
return false;
|
||||
@@ -3325,7 +3325,7 @@ bool Boiler::set_auxLimit(const char * value, const int8_t id) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Boiler::set_auxHeaterSource(const char * value, const int8_t id) {
|
||||
bool Boiler::set_auxHeaterSource(const char * value, const int8_t) {
|
||||
uint8_t v;
|
||||
if (Helpers::value2enum(value, v, FL_(enum_auxHeaterSource))) {
|
||||
write_command(0x491, 0, v, 0x491);
|
||||
@@ -3409,7 +3409,7 @@ bool Boiler::set_hpMaxPower(const char * value, const int8_t id) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Boiler::set_pvMaxComp(const char * value, const int8_t id) {
|
||||
bool Boiler::set_pvMaxComp(const char * value, const int8_t) {
|
||||
float v;
|
||||
if (Helpers::value2float(value, v)) {
|
||||
write_command(0x484, 54, (uint8_t)(v * 10), 0x484);
|
||||
@@ -3437,7 +3437,7 @@ bool Boiler::set_hpPowerLimit(const char * value, const int8_t id) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Boiler::set_powerReduction(const char * value, const int8_t id) {
|
||||
bool Boiler::set_powerReduction(const char * value, const int8_t) {
|
||||
int v;
|
||||
if (Helpers::value2number(value, v)) {
|
||||
write_command(0x484, 64, v / 10, 0x484);
|
||||
@@ -3661,7 +3661,7 @@ bool Boiler::set_shutdown(const char * value, const int8_t id) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Boiler::set_pumpKickHour(const char * value, const int8_t id) {
|
||||
bool Boiler::set_pumpKickHour(const char * value, const int8_t) {
|
||||
int v;
|
||||
if (Helpers::value2number(value, v, 0, 23)) {
|
||||
write_command(0xEB, 0, v, 0xEB);
|
||||
@@ -3670,7 +3670,7 @@ bool Boiler::set_pumpKickHour(const char * value, const int8_t id) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Boiler::set_pumpKickDay(const char * value, const int8_t id) {
|
||||
bool Boiler::set_pumpKickDay(const char * value, const int8_t) {
|
||||
uint8_t v;
|
||||
if (Helpers::value2enum(value, v, FL_(enum_dayOfWeek))) {
|
||||
write_command(0xEB, 1, v + 1, 0xEB);
|
||||
@@ -3679,7 +3679,7 @@ bool Boiler::set_pumpKickDay(const char * value, const int8_t id) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Boiler::set_pumpKickDelay(const char * value, const int8_t id) {
|
||||
bool Boiler::set_pumpKickDelay(const char * value, const int8_t) {
|
||||
int v;
|
||||
if (Helpers::value2number(value, v, 0, 32767)) {
|
||||
uint8_t data[2] = {(uint8_t)(v >> 8), (uint8_t)v};
|
||||
|
||||
@@ -278,7 +278,7 @@ bool Mixer::set_flowTempOffset(const char * value, const int8_t id) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Mixer::set_pressure(const char * value, const int8_t id) {
|
||||
bool Mixer::set_pressure(const char * value, const int8_t) {
|
||||
int v;
|
||||
if (!Helpers::value2number(value, v)) {
|
||||
return false;
|
||||
@@ -288,7 +288,7 @@ bool Mixer::set_pressure(const char * value, const int8_t id) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Mixer::set_wwprio(const char * value, const int8_t id) {
|
||||
bool Mixer::set_wwprio(const char * value, const int8_t) {
|
||||
bool b;
|
||||
if (!Helpers::value2bool(value, b)) {
|
||||
return false;
|
||||
|
||||
@@ -1122,7 +1122,7 @@ bool Solar::set_diffControl(const char * value, const int8_t id) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Solar::set_solarHeatAssistOn(const char * value, const int8_t id) {
|
||||
bool Solar::set_solarHeatAssistOn(const char * value, const int8_t) {
|
||||
float t;
|
||||
if (!Helpers::value2float(value, t)) {
|
||||
return false;
|
||||
@@ -1131,7 +1131,7 @@ bool Solar::set_solarHeatAssistOn(const char * value, const int8_t id) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Solar::set_solarHeatAssistOff(const char * value, const int8_t id) {
|
||||
bool Solar::set_solarHeatAssistOff(const char * value, const int8_t) {
|
||||
float t;
|
||||
if (!Helpers::value2float(value, t)) {
|
||||
return false;
|
||||
|
||||
+39
-29
@@ -1663,32 +1663,40 @@ void Thermostat::process_RC35Timer(const std::shared_ptr<const Telegram> & teleg
|
||||
has_update(telegram, hc->pause, 85); // time in hours
|
||||
has_update(telegram, hc->party, 86); // time in hours
|
||||
|
||||
if (telegram->message_length + telegram->offset >= 92 && telegram->offset <= 87) {
|
||||
char data[sizeof(hc->vacation) + 4]; // avoid compiler warning
|
||||
snprintf(data,
|
||||
sizeof(data),
|
||||
"%02d.%02d.%04d-%02d.%02d.%04d",
|
||||
telegram->message_data[87 - telegram->offset],
|
||||
telegram->message_data[88 - telegram->offset],
|
||||
telegram->message_data[89 - telegram->offset] + 2000,
|
||||
telegram->message_data[90 - telegram->offset],
|
||||
telegram->message_data[91 - telegram->offset],
|
||||
telegram->message_data[92 - telegram->offset] + 2000);
|
||||
has_update(hc->vacation, data, sizeof(hc->vacation));
|
||||
// vacation dates are in positions 87 to 92
|
||||
if (telegram->offset <= 87 && (telegram->offset + telegram->message_length) > 92) {
|
||||
const uint8_t pos = 87 - telegram->offset;
|
||||
if ((pos + 5) < EMS_MAX_TELEGRAM_MESSAGE_LENGTH) {
|
||||
char data[sizeof(hc->vacation) + 4]; // avoid compiler warning
|
||||
snprintf(data,
|
||||
sizeof(data),
|
||||
"%02d.%02d.%04d-%02d.%02d.%04d",
|
||||
telegram->message_data[pos],
|
||||
telegram->message_data[pos + 1],
|
||||
telegram->message_data[pos + 2] + 2000,
|
||||
telegram->message_data[pos + 3],
|
||||
telegram->message_data[pos + 4],
|
||||
telegram->message_data[pos + 5] + 2000);
|
||||
has_update(hc->vacation, data, sizeof(hc->vacation));
|
||||
}
|
||||
}
|
||||
|
||||
if (telegram->message_length + telegram->offset >= 98 && telegram->offset <= 93) {
|
||||
char data[sizeof(hc->holiday) + 4]; // avoid compiler warning
|
||||
snprintf(data,
|
||||
sizeof(data),
|
||||
"%02d.%02d.%04d-%02d.%02d.%04d",
|
||||
telegram->message_data[93 - telegram->offset],
|
||||
telegram->message_data[94 - telegram->offset],
|
||||
telegram->message_data[95 - telegram->offset] + 2000,
|
||||
telegram->message_data[96 - telegram->offset],
|
||||
telegram->message_data[97 - telegram->offset],
|
||||
telegram->message_data[98 - telegram->offset] + 2000);
|
||||
has_update(hc->holiday, data, sizeof(hc->holiday));
|
||||
// holiday dates are in positions 93 to 98
|
||||
if (telegram->offset <= 93 && (telegram->offset + telegram->message_length) > 98) {
|
||||
const uint8_t pos = 93 - telegram->offset;
|
||||
if ((pos + 5) < EMS_MAX_TELEGRAM_MESSAGE_LENGTH) {
|
||||
char data[sizeof(hc->holiday) + 4]; // avoid compiler warning
|
||||
snprintf(data,
|
||||
sizeof(data),
|
||||
"%02d.%02d.%04d-%02d.%02d.%04d",
|
||||
telegram->message_data[pos],
|
||||
telegram->message_data[pos + 1],
|
||||
telegram->message_data[pos + 2] + 2000,
|
||||
telegram->message_data[pos + 3],
|
||||
telegram->message_data[pos + 4],
|
||||
telegram->message_data[pos + 5] + 2000);
|
||||
has_update(hc->holiday, data, sizeof(hc->holiday));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1862,7 +1870,7 @@ void Thermostat::process_RCErrorMessage(const std::shared_ptr<const Telegram> &
|
||||
}
|
||||
|
||||
// 0xBF
|
||||
void Thermostat::process_ErrorMessageBF(const std::shared_ptr<const Telegram> & telegram) {
|
||||
void Thermostat::process_ErrorMessageBF(const std::shared_ptr<const Telegram> &) {
|
||||
EMSESP::send_read_request(0xC0, device_id(), 0, 20); // read last errorcode
|
||||
}
|
||||
|
||||
@@ -2338,7 +2346,7 @@ bool Thermostat::set_damping(const char * value, const int8_t id) {
|
||||
}
|
||||
|
||||
// 0x0241- Set solar
|
||||
bool Thermostat::set_solar(const char * value, const int8_t id) {
|
||||
bool Thermostat::set_solar(const char * value, const int8_t) {
|
||||
bool b;
|
||||
if (Helpers::value2bool(value, b)) {
|
||||
if (model() == EMSdevice::EMS_DEVICE_FLAG_RC100) {
|
||||
@@ -3034,7 +3042,7 @@ bool Thermostat::set_party(const char * value, const int8_t id) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Thermostat::set_absent(const char * value, const int8_t id) {
|
||||
bool Thermostat::set_absent(const char * value, const int8_t) {
|
||||
bool b;
|
||||
if (Helpers::value2bool(value, b)) {
|
||||
write_command(0x16E, 0, b ? 0xFF : 0, 0x16E);
|
||||
@@ -5172,7 +5180,7 @@ void Thermostat::register_device_values_hc(std::shared_ptr<Thermostat::HeatingCi
|
||||
register_device_value(tag, &hc->control, DeviceValueType::ENUM, FL_(enum_control2), FL_(control), DeviceValueUOM::NONE, MAKE_CF_CB(set_control));
|
||||
} else if (model == EMSdevice::EMS_DEVICE_FLAG_UI800) {
|
||||
register_device_value(tag, &hc->control, DeviceValueType::ENUM, FL_(enum_control3), FL_(control), DeviceValueUOM::NONE, MAKE_CF_CB(set_control));
|
||||
} else {
|
||||
} else if (device_id() == 0x10) { // only master thermostats have control by remote
|
||||
register_device_value(tag, &hc->control, DeviceValueType::ENUM, FL_(enum_control1), FL_(control), DeviceValueUOM::NONE, MAKE_CF_CB(set_control));
|
||||
}
|
||||
if (model != EMSdevice::EMS_DEVICE_FLAG_RC100 && model != EMSdevice::EMS_DEVICE_FLAG_CR120) {
|
||||
@@ -5476,7 +5484,9 @@ void Thermostat::register_device_values_hc(std::shared_ptr<Thermostat::HeatingCi
|
||||
FL_(nofrosttemp),
|
||||
DeviceValueUOM::DEGREES,
|
||||
MAKE_CF_CB(set_nofrosttemp));
|
||||
register_device_value(tag, &hc->control, DeviceValueType::ENUM, FL_(enum_j_control), FL_(control), DeviceValueUOM::NONE, MAKE_CF_CB(set_control));
|
||||
if (device_id() == 0x10) { // only master thermostats have control by remote
|
||||
register_device_value(tag, &hc->control, DeviceValueType::ENUM, FL_(enum_j_control), FL_(control), DeviceValueUOM::NONE, MAKE_CF_CB(set_control));
|
||||
}
|
||||
register_device_value(tag, &hc->program, DeviceValueType::ENUM, FL_(enum_progMode4), FL_(program), DeviceValueUOM::NONE, MAKE_CF_CB(set_program));
|
||||
register_device_value(tag,
|
||||
&hc->remotetemp,
|
||||
|
||||
@@ -87,7 +87,7 @@ void Ventilation::process_ModeMessage(const std::shared_ptr<const Telegram> & te
|
||||
}
|
||||
|
||||
// message 0x0587, data: 00 00 64 00 64 0A 00 01 54 01 00 01 00 00 00 46 00 00 00 02 00 A3 00 A3
|
||||
void Ventilation::process_BypassMessage(const std::shared_ptr<const Telegram> & telegram) {
|
||||
void Ventilation::process_BypassMessage(const std::shared_ptr<const Telegram> &) {
|
||||
// has_update(telegram, bypass_closing, 0);
|
||||
// has_update(telegram, bypass_opening, 1);
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
#define EMSESP_APP_VERSION "3.9.0-dev.0"
|
||||
#define EMSESP_APP_VERSION "3.9.0-dev.2"
|
||||
|
||||
@@ -195,7 +195,7 @@ StateUpdateResult WebCommands::update(JsonObject root, WebCommands & webCommands
|
||||
Command::add(
|
||||
EMSdevice::DeviceType::COMMAND,
|
||||
webCommands.commandItems.back().name,
|
||||
[name = std::string(webCommands.commandItems.back().name)](const char * value, const int8_t id, JsonObject output) {
|
||||
[name = std::string(webCommands.commandItems.back().name)](const char * value, const int8_t, JsonObject) {
|
||||
return EMSESP::webCommandService.dispatchCommand(name.c_str(), value); // value is optional
|
||||
},
|
||||
FL_(command_cmd),
|
||||
@@ -448,7 +448,7 @@ void WebCommandService::load_test_data() {
|
||||
Command::add(
|
||||
EMSdevice::DeviceType::COMMAND,
|
||||
item.name,
|
||||
[name = std::string(item.name)](const char * value, const int8_t id, JsonObject output) {
|
||||
[name = std::string(item.name)](const char * value, const int8_t, JsonObject) {
|
||||
return EMSESP::webCommandService.dispatchCommand(name.c_str(), value);
|
||||
},
|
||||
FL_(command_cmd),
|
||||
|
||||
@@ -147,7 +147,7 @@ StateUpdateResult WebCustomEntity::update(JsonObject root, WebCustomEntity & web
|
||||
Command::add(
|
||||
EMSdevice::DeviceType::CUSTOM,
|
||||
webCustomEntity.customEntityItems.back().name,
|
||||
[name = std::string(webCustomEntity.customEntityItems.back().name)](const char * value, const int8_t id, JsonObject output) {
|
||||
[name = std::string(webCustomEntity.customEntityItems.back().name)](const char * value, const int8_t id, JsonObject) {
|
||||
return EMSESP::webCustomEntityService.command_setvalue(value, id, name.c_str());
|
||||
},
|
||||
FL_(entity_cmd),
|
||||
@@ -798,7 +798,7 @@ void WebCustomEntityService::load_test_data() {
|
||||
Command::add(
|
||||
EMSdevice::DeviceType::CUSTOM,
|
||||
webCustomEntity.customEntityItems.back().name,
|
||||
[name = std::string(webCustomEntity.customEntityItems.back().name)](const char * value, const int8_t id, JsonObject output) {
|
||||
[name = std::string(webCustomEntity.customEntityItems.back().name)](const char * value, const int8_t id, JsonObject) {
|
||||
return EMSESP::webCustomEntityService.command_setvalue(value, id, name.c_str());
|
||||
},
|
||||
FL_(entity_cmd),
|
||||
@@ -834,7 +834,7 @@ void WebCustomEntityService::load_test_data() {
|
||||
Command::add(
|
||||
EMSdevice::DeviceType::CUSTOM,
|
||||
webCustomEntity.customEntityItems.back().name,
|
||||
[name = std::string(webCustomEntity.customEntityItems.back().name)](const char * value, const int8_t id, JsonObject output) {
|
||||
[name = std::string(webCustomEntity.customEntityItems.back().name)](const char * value, const int8_t id, JsonObject) {
|
||||
return EMSESP::webCustomEntityService.command_setvalue(value, id, name.c_str());
|
||||
},
|
||||
FL_(entity_cmd),
|
||||
@@ -857,7 +857,7 @@ void WebCustomEntityService::load_test_data() {
|
||||
Command::add(
|
||||
EMSdevice::DeviceType::CUSTOM,
|
||||
webCustomEntity.customEntityItems.back().name,
|
||||
[name = std::string(webCustomEntity.customEntityItems.back().name)](const char * value, const int8_t id, JsonObject output) {
|
||||
[name = std::string(webCustomEntity.customEntityItems.back().name)](const char * value, const int8_t id, JsonObject) {
|
||||
return EMSESP::webCustomEntityService.command_setvalue(value, id, name.c_str());
|
||||
},
|
||||
FL_(entity_cmd),
|
||||
|
||||
@@ -98,7 +98,7 @@ StateUpdateResult WebScheduler::update(JsonObject root, WebScheduler & webSchedu
|
||||
Command::add(
|
||||
EMSdevice::DeviceType::SCHEDULER,
|
||||
webScheduler.scheduleItems.back().name,
|
||||
[name = std::string(webScheduler.scheduleItems.back().name)](const char * value, const int8_t id, JsonObject output) {
|
||||
[name = std::string(webScheduler.scheduleItems.back().name)](const char * value, const int8_t id, JsonObject) {
|
||||
return EMSESP::webSchedulerService.command_setvalue(value, id, name.c_str());
|
||||
},
|
||||
FL_(schedule_cmd),
|
||||
@@ -464,7 +464,7 @@ void WebSchedulerService::load_test_data() {
|
||||
Command::add(
|
||||
EMSdevice::DeviceType::SCHEDULER,
|
||||
item.name,
|
||||
[name = std::string(item.name)](const char * value, const int8_t id, JsonObject output) {
|
||||
[name = std::string(item.name)](const char * value, const int8_t id, JsonObject) {
|
||||
return EMSESP::webSchedulerService.command_setvalue(value, id, name.c_str());
|
||||
},
|
||||
FL_(schedule_cmd),
|
||||
|
||||
Reference in New Issue
Block a user