diff --git a/CHANGELOG.md b/CHANGELOG.md index da4e5c951..643697cdc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,17 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development -## [12.1.1.4] +## [12.1.1.5] +### Added +- Command ``Sunrise 0..3`` to select sunrise dawn angle between Normal, Civil, Nautical or Astronomical (#16795) + +### Changed + +### Fixed + +### Removed + +## [12.1.1.4] 20221012 ### Added - Support for Shelly Plus 2PM using template ``{"NAME":"Shelly Plus 2PM PCB v0.1.9","GPIO":[320,0,0,0,32,192,0,0,225,224,0,0,0,0,193,0,0,0,0,0,0,608,640,3458,0,0,0,0,0,9472,0,4736,0,0,0,0],"FLAG":0,"BASE":1,"CMND":"AdcParam1 2,10000,10000,3350"}`` - Zigbee Alexa/Hue emulation, support multiple switches on separate endpoints (#16718) @@ -16,10 +26,6 @@ All notable changes to this project will be documented in this file. - ESP32 LVGL library from v8.3.0 to v8.3.2 - Increase serial console fixed input buffer size from 520 to 800 -### Fixed - -### Removed - ## [12.1.1.3] 20221003 ### Added - ESP32-S2 and ESP32-S3 touch button support diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 37b5b91ba..c2bcdcb19 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -116,11 +116,13 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Command ``UrlFetch `` to download a file to filesystem - Command ``DspSpeed 2..127`` to control message rotation speed on display of POWR3xxD and THR3xxD - Command ``DspLine<1|2> ,,,,...`` to select message(s) on display of POWR3xxD and THR3xxD +- Command ``Sunrise 0..3`` to select sunrise dawn angle between Normal, Civil, Nautical or Astronomical [#16795](https://github.com/arendst/Tasmota/issues/16795) - Support for Shelly Plus 2PM - Support for SGP40 gas and air quality sensor [#16341](https://github.com/arendst/Tasmota/issues/16341) - Support for Modbus writing using ModbusBridge by JeroenSt [#16351](https://github.com/arendst/Tasmota/issues/16351) - Support for DFRobot SEN0390 V30B ambient light sensor [#16105](https://github.com/arendst/Tasmota/issues/16105) - Support for QMC5883L magnetic induction sensor by Helge Scheunemann [#16714](https://github.com/arendst/Tasmota/issues/16714) +- Support for Modbus Energy Monitoring devices using a rule file. See ``xnrg_29_modbus.ino`` for more information - Zigbee device plugin mechanism with commands ``ZbLoad``, ``ZbUnload`` and ``ZbLoadDump`` [#16252](https://github.com/arendst/Tasmota/issues/16252) - Zigbee basic support for Green Power [#16407](https://github.com/arendst/Tasmota/issues/16407) - Zigbee friendly names per endpoint @@ -143,6 +145,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - ESP32 NimBLE library from v1.3.6 to v1.4.0 - ESP32 LVGL library from v8.3.0 to v8.3.2 - ESP32 Tasmota Core32 from 2.0.4.1 to 2.0.5 +- Increase serial console input buffer size from 520 to 800 - Button debouncing V3 by adopting switch debounce code [#16339](https://github.com/arendst/Tasmota/issues/16339) - Thermostat max allowed temperature from 100 to 200C [#16363](https://github.com/arendst/Tasmota/issues/16363) - Using command ``SerialBuffer`` raise max allowed buffer size to 2048 characters [#16374](https://github.com/arendst/Tasmota/issues/16374) diff --git a/tasmota/include/i18n.h b/tasmota/include/i18n.h index 900a28c61..84c0a78a6 100644 --- a/tasmota/include/i18n.h +++ b/tasmota/include/i18n.h @@ -589,6 +589,7 @@ #define D_CMND_TIMERS "Timers" #define D_CMND_LATITUDE "Latitude" #define D_CMND_LONGITUDE "Longitude" +#define D_CMND_SUNRISE "Sunrise" // Commands xdrv_23_zigbee.ino #define D_PRFX_ZB "Zb" diff --git a/tasmota/include/tasmota_types.h b/tasmota/include/tasmota_types.h index 0f3561b1a..faa301404 100644 --- a/tasmota/include/tasmota_types.h +++ b/tasmota/include/tasmota_types.h @@ -268,8 +268,7 @@ typedef union { uint32_t spare25 : 1; // bit 25 uint32_t spare26 : 1; // bit 26 uint32_t spare27 : 1; // bit 27 - uint32_t spare28 : 1; // bit 28 - uint32_t spare29 : 1; // bit 29 + uint32_t sunrise_dawn_angle : 2; // bits 28/29 (v12.1.1.4) - uint32_t temperature_set_res : 2; // bits 30/31 (v9.3.1.4) - (Tuya) }; } SysMBitfield2; diff --git a/tasmota/include/tasmota_version.h b/tasmota/include/tasmota_version.h index e22993eb5..60dc33542 100644 --- a/tasmota/include/tasmota_version.h +++ b/tasmota/include/tasmota_version.h @@ -20,6 +20,6 @@ #ifndef _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_ -const uint32_t VERSION = 0x0C010104; // 12.1.1.4 +const uint32_t VERSION = 0x0C010105; // 12.1.1.5 #endif // _TASMOTA_VERSION_H_ diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index e43a80077..493028b1e 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -226,6 +226,8 @@ bool tasconsole_serial = true; HardwareSerial TasConsole = Serial; // Only serial interface #endif // ESP32 +char EmptyStr[1] = { 0 }; // Provide a pointer destination to an empty char string + struct TasmotaGlobal_t { uint32_t global_update; // Timestamp of last global temperature and humidity update uint32_t baudrate; // Current Serial baudrate diff --git a/tasmota/tasmota_support/settings.ino b/tasmota/tasmota_support/settings.ino index 6e5521253..9be791678 100644 --- a/tasmota/tasmota_support/settings.ino +++ b/tasmota/tasmota_support/settings.ino @@ -1214,6 +1214,10 @@ void SettingsDefaultSet2(void) { Settings->longitude = (int)((double)LONGITUDE * 1000000); SettingsResetStd(); SettingsResetDst(); +// if (DAWN_NORMAL == SUNRISE_DAWN_ANGLE) { mbflag2.sunrise_dawn_angle |= 0; } + if (DAWN_CIVIL == SUNRISE_DAWN_ANGLE) { mbflag2.sunrise_dawn_angle |= 1; } + else if (DAWN_NAUTIC == SUNRISE_DAWN_ANGLE) { mbflag2.sunrise_dawn_angle |= 2; } + else if (DAWN_ASTRONOMIC == SUNRISE_DAWN_ANGLE) { mbflag2.sunrise_dawn_angle |= 3; } Settings->button_debounce = KEY_DEBOUNCE_TIME; Settings->switch_debounce = SWITCH_DEBOUNCE_TIME; @@ -1260,6 +1264,7 @@ void SettingsDefaultSet2(void) { Settings->flag4 = flag4; Settings->flag5 = flag5; Settings->flag6 = flag6; + Settings->mbflag2 = mbflag2; } void SettingsDefaultSet3(void) { @@ -1581,6 +1586,12 @@ void SettingsDelta(void) { Settings->touch_threshold = ESP32_TOUCH_THRESHOLD; } #endif // ESP32 SOC_TOUCH_VERSION_1 or SOC_TOUCH_VERSION_2 + if (Settings->version < 0x0C010105) { // 12.1.1.5 + // if (DAWN_NORMAL == SUNRISE_DAWN_ANGLE) { mbflag2.sunrise_dawn_angle = 0; } + if (DAWN_CIVIL == SUNRISE_DAWN_ANGLE) { Settings->mbflag2.sunrise_dawn_angle = 1; } + else if (DAWN_NAUTIC == SUNRISE_DAWN_ANGLE) { Settings->mbflag2.sunrise_dawn_angle = 2; } + else if (DAWN_ASTRONOMIC == SUNRISE_DAWN_ANGLE) { Settings->mbflag2.sunrise_dawn_angle = 3; } + } Settings->version = VERSION; SettingsSave(1); diff --git a/tasmota/tasmota_support/support.ino b/tasmota/tasmota_support/support.ino index 3d940b493..3dbebd6e0 100755 --- a/tasmota/tasmota_support/support.ino +++ b/tasmota/tasmota_support/support.ino @@ -550,6 +550,17 @@ char* UpperCase_P(char* dest, const char* source) return dest; } +char* SetStr(const char* str) { + if (nullptr == str) { str = PSTR(""); } // nullptr is considered empty string + size_t str_len = strlen(str); + if (0 == str_len) { return EmptyStr; } // return empty string + + char* new_str = (char*) malloc(str_len + 1); + if (nullptr == new_str) { return EmptyStr; } // return empty string + strlcpy(new_str, str, str_len + 1); + return new_str; +} + bool StrCaseStr_P(const char* source, const char* search) { char case_source[strlen_P(source) +1]; UpperCase_P(case_source, source); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino index 4636e6390..4752702b2 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino @@ -203,7 +203,7 @@ char* WebEnergyFormat(char* result, float* input, uint32_t resolution, uint32_t uint32_t index = (single) ? 1 : Energy.phase_count; // 1,2,3 result[0] = '\0'; for (uint32_t i = 0; i < index; i++) { - ext_snprintf_P(result, TOPSZ, PSTR("%s%s%*_f"), result, (i)?" / ":"", resolution, &input[i]); + ext_snprintf_P(result, GUISZ, PSTR("%s%s%*_f"), result, (i)?" / ":"", resolution, &input[i]); } #endif // USE_ENERGY_COLUMN_GUI return result; diff --git a/tasmota/tasmota_xdrv_driver/xdrv_09_timers.ino b/tasmota/tasmota_xdrv_driver/xdrv_09_timers.ino index bde181967..438ade4d5 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_09_timers.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_09_timers.ino @@ -41,14 +41,14 @@ const char kTimerCommands[] PROGMEM = "|" // No prefix D_CMND_TIMER "|" D_CMND_TIMERS #ifdef USE_SUNRISE - "|" D_CMND_LATITUDE "|" D_CMND_LONGITUDE + "|" D_CMND_LATITUDE "|" D_CMND_LONGITUDE "|" D_CMND_SUNRISE #endif ; void (* const TimerCommand[])(void) PROGMEM = { &CmndTimer, &CmndTimers #ifdef USE_SUNRISE - , &CmndLatitude, &CmndLongitude + , &CmndLatitude, &CmndLongitude, &CmndSunrise #endif }; @@ -129,7 +129,19 @@ void DuskTillDawn(uint8_t *hour_up,uint8_t *minute_up, uint8_t *hour_down, uint8 h (D) = -12.0 nautische Dämmerung h (D) = -18.0 astronomische Dämmerung */ - const float h = SUNRISE_DAWN_ANGLE * RAD; + float sunrise_dawn_angle = DAWN_NORMAL; + switch (Settings->mbflag2.sunrise_dawn_angle) { + case 1: + sunrise_dawn_angle = DAWN_CIVIL; + break; + case 2: + sunrise_dawn_angle = DAWN_NAUTIC; + break; + case 3: + sunrise_dawn_angle = DAWN_ASTRONOMIC; + break; + } + const float h = sunrise_dawn_angle * RAD; const float sin_h = sinf(h); // let GCC pre-compute the sin() at compile time float B = Settings->latitude / (1000000.0f / RAD); // geographische Breite @@ -508,21 +520,26 @@ void CmndTimers(void) } #ifdef USE_SUNRISE -void CmndLongitude(void) -{ +void CmndLongitude(void) { if (XdrvMailbox.data_len) { Settings->longitude = (int)(CharToFloat(XdrvMailbox.data) *1000000); } ResponseCmndFloat((float)(Settings->longitude) /1000000, 6); } -void CmndLatitude(void) -{ +void CmndLatitude(void) { if (XdrvMailbox.data_len) { Settings->latitude = (int)(CharToFloat(XdrvMailbox.data) *1000000); } ResponseCmndFloat((float)(Settings->latitude) /1000000, 6); } + +void CmndSunrise(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 3)) { + Settings->mbflag2.sunrise_dawn_angle = XdrvMailbox.payload; + } + ResponseCmndNumber(Settings->mbflag2.sunrise_dawn_angle); +} #endif // USE_SUNRISE /*********************************************************************************************\ diff --git a/tasmota/tasmota_xnrg_energy/xnrg_29_modbus.ino b/tasmota/tasmota_xnrg_energy/xnrg_29_modbus.ino index 92e64fa90..c4abc1154 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_29_modbus.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_29_modbus.ino @@ -219,20 +219,6 @@ NrgMbsUser_t *NrgMbsUser = nullptr; /*********************************************************************************************/ -char EmptyStr[1] = { 0 }; - -char* SetStr(const char* str) { - if (nullptr == str) { str = PSTR(""); } // nullptr is considered empty string - size_t str_len = strlen(str); - if (0 == str_len) { return EmptyStr; } // return empty string - - char* new_str = (char*) malloc(str_len + 1); - strlcpy(new_str, str, str_len + 1); - return new_str; -} - -/*********************************************************************************************/ - void EnergyModbusLoop(void) { #ifdef ENERGY_MODBUS_TICKER if (NrgMbsParam.mutex || TasmotaGlobal.ota_state_flag) { return; }