Add command `Sunrise 0..3` to select sunrise dawn angle

- Bump version to v12.1.1.5
- Add command ``Sunrise 0..3`` to select sunrise dawn angle between Normal, Civil, Nautical or Astronomical (#16795)
This commit is contained in:
Theo Arends 2022-10-12 11:02:54 +02:00
parent 40f7cfba4c
commit 5cfbbd4302
11 changed files with 66 additions and 30 deletions

View File

@ -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

View File

@ -116,11 +116,13 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo
- Command ``UrlFetch <url>`` 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> <index>,<unit>,<index>,<unit>,...`` 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)

View File

@ -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"

View File

@ -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;

View File

@ -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_

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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
/*********************************************************************************************\

View File

@ -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; }