Merge branch 'development' into prerelease-15.2.0

This commit is contained in:
Theo Arends 2025-12-11 09:26:21 +01:00
commit 4a32146d99
5 changed files with 25 additions and 13 deletions

View File

@ -7,7 +7,7 @@
- [ ] Only relevant files were touched - [ ] Only relevant files were touched
- [ ] Only one feature/fix was added per PR and the code change compiles without warnings - [ ] Only one feature/fix was added per PR and the code change compiles without warnings
- [ ] The code change is tested and works with Tasmota core ESP8266 V.2.7.8 - [ ] The code change is tested and works with Tasmota core ESP8266 V.2.7.8
- [ ] The code change is tested and works with Tasmota core ESP32 V.3.1.6 - [ ] The code change is tested and works with Tasmota core ESP32 V.3.1.7
- [ ] I accept the [CLA](https://github.com/arendst/Tasmota/blob/development/CONTRIBUTING.md#contributor-license-agreement-cla). - [ ] I accept the [CLA](https://github.com/arendst/Tasmota/blob/development/CONTRIBUTING.md#contributor-license-agreement-cla).
_NOTE: The code change must pass CI tests. **Your PR cannot be merged unless tests pass**_ _NOTE: The code change must pass CI tests. **Your PR cannot be merged unless tests pass**_

View File

@ -18,6 +18,7 @@ All notable changes to this project will be documented in this file.
### Changed ### Changed
- ESP32 Platform from 2025.11.30 to 2025.11.31, Framework (Arduino Core) from v3.1.5 to v3.1.6 and IDF from v5.3.4.251110 to v5.3.4.251110 (#24146) - ESP32 Platform from 2025.11.30 to 2025.11.31, Framework (Arduino Core) from v3.1.5 to v3.1.6 and IDF from v5.3.4.251110 to v5.3.4.251110 (#24146)
- Refactored DALI using TasmotaDali library v1.0.0 adding frame receive buffer - Refactored DALI using TasmotaDali library v1.0.0 adding frame receive buffer
- ESP32 Platform from 2025.11.31 to 2025.12.30, Framework (Arduino Core) from v3.1.6 to v3.1.7 and IDF from v5.3.4.251110 to v5.3.4.20251205 (#24212)
### Fixed ### Fixed
- ESP32-P4 Hosted MCU updated to v2.6.6 solving WiFi boot issues (#24146) - ESP32-P4 Hosted MCU updated to v2.6.6 solving WiFi boot issues (#24146)
@ -25,6 +26,7 @@ All notable changes to this project will be documented in this file.
- PCA9685 V2 driver PWMTO fading logic and overflow (#24159) - PCA9685 V2 driver PWMTO fading logic and overflow (#24159)
- RGBW handling in TasmotaLED and xlgt_01_ws2812_esp32 (#24172) - RGBW handling in TasmotaLED and xlgt_01_ws2812_esp32 (#24172)
- ArtNet single light color mapping using `ChannelRemap` (#24058) - ArtNet single light color mapping using `ChannelRemap` (#24058)
- Thermostat temperature unit (#24213)
## [15.1.0.2] 20251122 ## [15.1.0.2] 20251122
### Added ### Added

View File

@ -36,9 +36,9 @@ While fallback or downgrading is common practice it was never supported due to S
This release will be supported from ESP8266/Arduino library Core version **2.7.8** due to reported security and stability issues on previous Core version. This will also support gzipped binaries. This release will be supported from ESP8266/Arduino library Core version **2.7.8** due to reported security and stability issues on previous Core version. This will also support gzipped binaries.
This release will be supported from ESP32/Arduino library Core version **v3.1.6**. This release will be supported from ESP32/Arduino library Core version **v3.1.7**.
Support of ESP8266 Core versions before 2.7.8 and ESP32 Core versions before v3.1.6 have been removed. Support of ESP8266 Core versions before 2.7.8 and ESP32 Core versions before v3.1.7 have been removed.
## Initial configuration tools ## Initial configuration tools
@ -76,7 +76,7 @@ Historical binaries can be downloaded from
The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmota.com/tasmota/release/tasmota.bin.gz`` The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmota.com/tasmota/release/tasmota.bin.gz``
### ESP32, ESP32-C2, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-P4, ESP32-S2 and ESP32-S3 based ### ESP32, ESP32-C2, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-P4, ESP32-S2 and ESP32-S3 based
The following binary downloads have been compiled with ESP32/Arduino library core version **v3.1.6**. The following binary downloads have been compiled with ESP32/Arduino library core version **v3.1.7**.
- **tasmota32.bin** = The Tasmota version with most drivers including additional sensors and KNX for 4M+ flash. **RECOMMENDED RELEASE BINARY** - **tasmota32.bin** = The Tasmota version with most drivers including additional sensors and KNX for 4M+ flash. **RECOMMENDED RELEASE BINARY**
- **tasmota32solo1.bin** = The Tasmota version with most drivers including additional sensors and KNX for single core ESP32 and 4M+ flash. - **tasmota32solo1.bin** = The Tasmota version with most drivers including additional sensors and KNX for single core ESP32 and 4M+ flash.
@ -133,7 +133,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm
- Berry `tasmota.micros()` to get time in microseconds [#24192](https://github.com/arendst/Tasmota/issues/24192) - Berry `tasmota.micros()` to get time in microseconds [#24192](https://github.com/arendst/Tasmota/issues/24192)
### Changed ### Changed
- ESP32 Platform from 2025.11.30 to 2025.11.31, Framework (Arduino Core) from v3.1.5 to v3.1.6 and IDF from v5.3.4.250826 to v5.3.4.251110 [#24146](https://github.com/arendst/Tasmota/issues/24118) - ESP32 Platform from 2025.11.30 to 2025.12.30, Framework (Arduino Core) from v3.1.5 to v3.1.7 and IDF from v5.3.4.250826 to v5.3.4.20251205 [#24212](https://github.com/arendst/Tasmota/issues/24212)
- LVGL library from v9.3.0 to v9.4.0 [#24028](https://github.com/arendst/Tasmota/issues/24028) - LVGL library from v9.3.0 to v9.4.0 [#24028](https://github.com/arendst/Tasmota/issues/24028)
- JPEGDEC library from v1.8.3 to v1.8.4 [#24120](https://github.com/arendst/Tasmota/issues/24120) - JPEGDEC library from v1.8.3 to v1.8.4 [#24120](https://github.com/arendst/Tasmota/issues/24120)
- GPIOViewer from v1.6.3 to v1.7.0 - GPIOViewer from v1.6.3 to v1.7.0
@ -149,6 +149,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm
- DALI protocol errors - DALI protocol errors
- RGBW handling in TasmotaLED and xlgt_01_ws2812_esp32 [#24172](https://github.com/arendst/Tasmota/issues/24172) - RGBW handling in TasmotaLED and xlgt_01_ws2812_esp32 [#24172](https://github.com/arendst/Tasmota/issues/24172)
- ArtNet single light color mapping using `ChannelRemap` [#24058](https://github.com/arendst/Tasmota/issues/24058) - ArtNet single light color mapping using `ChannelRemap` [#24058](https://github.com/arendst/Tasmota/issues/24058)
- Thermostat temperature unit [#24213](https://github.com/arendst/Tasmota/issues/24213)
- TLS fix ECDSA and add `SetOption165 1` to enable ECDSA in addition to RSA [#24000](https://github.com/arendst/Tasmota/issues/24000) - TLS fix ECDSA and add `SetOption165 1` to enable ECDSA in addition to RSA [#24000](https://github.com/arendst/Tasmota/issues/24000)
- ESP32-P4 Hosted MCU updated to v2.6.6 solving WiFi boot issues [#24146](https://github.com/arendst/Tasmota/issues/24118) - ESP32-P4 Hosted MCU updated to v2.6.6 solving WiFi boot issues [#24146](https://github.com/arendst/Tasmota/issues/24118)
- ESP32-Solo1 using pre-compiled Arduino libraries [#24146](https://github.com/arendst/Tasmota/issues/24118) - ESP32-Solo1 using pre-compiled Arduino libraries [#24146](https://github.com/arendst/Tasmota/issues/24118)

View File

@ -97,7 +97,7 @@ custom_component_remove =
espressif/cmake_utilities espressif/cmake_utilities
[core32] [core32]
platform = https://github.com/tasmota/platform-espressif32/releases/download/2025.11.31/platform-espressif32.zip platform = https://github.com/tasmota/platform-espressif32/releases/download/2025.12.30/platform-espressif32.zip
platform_packages = platform_packages =
build_unflags = ${esp32_defaults.build_unflags} build_unflags = ${esp32_defaults.build_unflags}
build_flags = ${esp32_defaults.build_flags} build_flags = ${esp32_defaults.build_flags}

View File

@ -201,8 +201,8 @@ struct THERMOSTAT {
uint32_t time_ctr_checkpoint = 0; // Time to finalize the control cycle within the PI strategy or to switch to PI from Rampup in seconds uint32_t time_ctr_checkpoint = 0; // Time to finalize the control cycle within the PI strategy or to switch to PI from Rampup in seconds
uint32_t time_ctr_changepoint = 0; // Time until switching off output within the controller in seconds uint32_t time_ctr_changepoint = 0; // Time until switching off output within the controller in seconds
int32_t temp_measured_gradient = 0; // Temperature measured gradient from sensor in thousandths of degrees per hour int32_t temp_measured_gradient = 0; // Temperature measured gradient from sensor in thousandths of degrees per hour
int16_t temp_target_level = THERMOSTAT_TEMP_INIT; // Target level of the thermostat in tenths of degrees int16_t temp_target_level = THERMOSTAT_TEMP_INIT; // Target level of the thermostat in tenths of degrees celsius
int16_t temp_target_level_ctr = THERMOSTAT_TEMP_INIT; // Target level set for the controller int16_t temp_target_level_ctr = THERMOSTAT_TEMP_INIT; // Target level set for the controller in tenths of degrees celsius
int16_t temp_pi_accum_error = 0; // Temperature accumulated error for the PI controller in hundredths of degrees int16_t temp_pi_accum_error = 0; // Temperature accumulated error for the PI controller in hundredths of degrees
int16_t temp_pi_error = 0; // Temperature error for the PI controller in hundredths of degrees int16_t temp_pi_error = 0; // Temperature error for the PI controller in hundredths of degrees
int32_t time_proportional_pi; // Time proportional part of the PI controller int32_t time_proportional_pi; // Time proportional part of the PI controller
@ -1402,7 +1402,7 @@ void ThermostatGetLocalSensor(uint8_t ctr_output) {
JsonParserToken value_token = root[sensor_name].getObject()[PSTR(D_JSON_TEMPERATURE)]; JsonParserToken value_token = root[sensor_name].getObject()[PSTR(D_JSON_TEMPERATURE)];
if (value_token.isNum()) { if (value_token.isNum()) {
int16_t value = value_token.getFloat() * 10; int16_t value = value_token.getFloat() * 10;
if (Thermostat[ctr_output].status.temp_format == TEMP_FAHRENHEIT) { if (Settings->flag.temperature_conversion) { // SetOption8 - Local Sensor provided in Fahrenheit
value = ThermostatFahrenheitToCelsius(value, TEMP_CONV_ABSOLUTE); value = ThermostatFahrenheitToCelsius(value, TEMP_CONV_ABSOLUTE);
} }
if ( (value >= -1000) if ( (value >= -1000)
@ -2085,18 +2085,27 @@ void ThermostatShow(uint8_t ctr_output, bool json)
} else { } else {
char c_unit = Thermostat[ctr_output].status.temp_format==TEMP_CELSIUS ? D_UNIT_CELSIUS[0] : D_UNIT_FAHRENHEIT[0]; char c_unit = Thermostat[ctr_output].status.temp_format==TEMP_CELSIUS ? D_UNIT_CELSIUS[0] : D_UNIT_FAHRENHEIT[0];
float f_temperature; float f_temperature;
int32_t value;
WSContentSend_P(HTTP_THERMOSTAT_INFO, ctr_output + 1, D_ENABLED); WSContentSend_P(HTTP_THERMOSTAT_INFO, ctr_output + 1, D_ENABLED);
f_temperature = Thermostat[ctr_output].temp_target_level / 10.0f; value = Thermostat[ctr_output].temp_target_level; // in tenths of degrees Celsius
if (Thermostat[ctr_output].status.temp_format == TEMP_FAHRENHEIT) {
value = ThermostatCelsiusToFahrenheit(value, TEMP_CONV_ABSOLUTE);
}
f_temperature = value / 10.0f;
WSContentSend_PD(HTTP_THERMOSTAT_TEMPERATURE, D_THERMOSTAT_SET_POINT, Settings->flag2.temperature_resolution, &f_temperature, c_unit); WSContentSend_PD(HTTP_THERMOSTAT_TEMPERATURE, D_THERMOSTAT_SET_POINT, Settings->flag2.temperature_resolution, &f_temperature, c_unit);
f_temperature = Thermostat[ctr_output].temp_measured / 10.0f; value = Thermostat[ctr_output].temp_measured; // in tenths of degrees Celsius
if (Thermostat[ctr_output].status.temp_format == TEMP_FAHRENHEIT) {
value = ThermostatCelsiusToFahrenheit(value, TEMP_CONV_ABSOLUTE);
}
f_temperature = value / 10.0f;
WSContentSend_PD(HTTP_THERMOSTAT_TEMPERATURE, D_THERMOSTAT_SENSOR, Settings->flag2.temperature_resolution, &f_temperature, c_unit); WSContentSend_PD(HTTP_THERMOSTAT_TEMPERATURE, D_THERMOSTAT_SENSOR, Settings->flag2.temperature_resolution, &f_temperature, c_unit);
int16_t value = Thermostat[ctr_output].temp_measured_gradient; value = Thermostat[ctr_output].temp_measured_gradient;
if (Thermostat[ctr_output].status.temp_format == TEMP_FAHRENHEIT) { if (Thermostat[ctr_output].status.temp_format == TEMP_FAHRENHEIT) {
value = ThermostatCelsiusToFahrenheit((int32_t)Thermostat[ctr_output].temp_measured_gradient, TEMP_CONV_RELATIVE); value = ThermostatCelsiusToFahrenheit(value, TEMP_CONV_RELATIVE);
} }
f_temperature = abs(value) / 1000.0f; f_temperature = abs(value) / 1000.0f;
WSContentSend_PD(HTTP_THERMOSTAT_TEMP_GRAD, value < 0 ? '-' : '+', Settings->flag2.temperature_resolution, &f_temperature, c_unit); WSContentSend_PD(HTTP_THERMOSTAT_TEMP_GRAD, value < 0 ? '-' : '+', Settings->flag2.temperature_resolution, &f_temperature, c_unit);