From 86ec4af6c55a57d64cca74988a148404f9cd5832 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 30 Apr 2021 15:42:57 +0200 Subject: [PATCH] Make Telegram command ``TmState`` persistent Make Telegram command ``TmState`` persistent (#11965) --- CHANGELOG.md | 6 +++- RELEASENOTES.md | 1 + tasmota/settings.h | 64 +++++++++++++++++++++++++++++++----- tasmota/settings.ino | 11 ++++--- tasmota/tasmota_version.h | 2 +- tasmota/xdrv_40_telegram.ino | 17 ++++------ 6 files changed, 76 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 32ad7bbd1..d0656cd43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,11 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development -## [9.4.0.2] +## [9.4.0.3] +### Added +- Make Telegram command ``TmState`` persistent (#11965) + +## [9.4.0.2] 20210430 ### Added - Initial support for optional ``Template`` JSON fieldpair ``"CMND":"||..."`` (#11788) - ESP32 pulldown buttons ``Button_d`` and ``Button_id`` and switches ``Switch_d`` (#10814) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 3593304e3..337ff0a18 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -81,6 +81,7 @@ The binaries can be downloaded from either https://github.com/arendst/Tasmota/tr - Initial support for optional ``Template`` JSON fieldpair ``"CMND":"||..."`` [#11788](https://github.com/arendst/Tasmota/issues/11788) - ESP32 pulldown buttons ``Button_d`` and ``Button_id`` and switches ``Switch_d`` [#10814](https://github.com/arendst/Tasmota/issues/10814) - Support for MQTT using Azure IoT Hub by Kevin Saye [#11906](https://github.com/arendst/Tasmota/issues/11906) +- Make Telegram command ``TmState`` persistent [#11965](https://github.com/arendst/Tasmota/issues/11965) ### Breaking Changed diff --git a/tasmota/settings.h b/tasmota/settings.h index 8388bb81d..d3e60ad12 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -22,6 +22,7 @@ const uint8_t PARAM8_SIZE = 18; // Number of param bytes (SetOption) +// Bitfield to be used for any SetOption0 .. SetOption31 persistent single bit typedef union { // Restricted by MISRA-C Rule 18.4 but so useful... uint32_t data; // Allow bit manipulation using SetOption struct { // SetOption0 .. SetOption31 @@ -58,8 +59,9 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t hass_light : 1; // bit 30 (v6.0.0b) - SetOption30 - (HAss) enforce autodiscovery as light (1) uint32_t global_state : 1; // bit 31 (v6.1.0) - SetOption31 - (Wifi, MQTT) Control link led blinking (1) }; -} SysBitfield; +} SOBitfield; +// Bitfield to be used for any SetOption50 .. SetOption81 persistent single bit typedef union { // Restricted by MISRA-C Rule 18.4 but so useful... uint32_t data; // Allow bit manipulation using SetOption struct { // SetOption50 .. SetOption81 @@ -96,8 +98,9 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t shutter_mode : 1; // bit 30 (v6.6.0.14) - SetOption80 - (Shutter) Enable shutter support (1) uint32_t pcf8574_ports_inverted : 1; // bit 31 (v6.6.0.14) - SetOption81 - (PCF8574) Invert all ports on PCF8574 devices (1) }; -} SysBitfield3; +} SOBitfield3; +// Bitfield to be used for any SetOption82 .. SetOption113 persistent single bit typedef union { // Restricted by MISRA-C Rule 18.4 but so useful... uint32_t data; // Allow bit manipulation using SetOption struct { // SetOption82 .. SetOption113 @@ -134,8 +137,9 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t zb_topic_fname : 1; // bit 30 (v8.5.0.1) - SetOption112 - (Zigbee) Use friendly name in zigbee topic (1) (use with SetOption89) uint32_t rotary_poweron_dimlow : 1; // bit 31 (v9.0.0.2) - SetOption113 - (Rotary) Set dimmer low on rotary dial after power off (1) }; -} SysBitfield4; +} SOBitfield4; +// Bitfield to be used for any SetOption114 .. SetOption145 persistent single bit typedef union { // Restricted by MISRA-C Rule 18.4 but so useful... uint32_t data; // Allow bit manipulation using SetOption struct { // SetOption114 .. SetOption145 @@ -172,8 +176,9 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t spare30 : 1; // bit 30 uint32_t spare31 : 1; // bit 31 }; -} SysBitfield5; +} SOBitfield5; +// Bitfield to be used for persistent multi bit typedef union { uint32_t data; // Allow bit manipulation struct { @@ -195,6 +200,7 @@ typedef union { }; } SysMBitfield1; +// Bitfield to be used for persistent multi bit typedef union { uint32_t data; // Allow bit manipulation struct { @@ -232,6 +238,45 @@ typedef union { }; } SysMBitfield2; +// Bitfield to be used for non-SetOption persistent single bit +typedef union { + uint32_t data; // Allow bit manipulation + struct { + uint32_t telegram_send_enable : 1; // bit 0 (v9.4.0.3) - CMND_TMSTATE 0/1 - Enable Telegram send + uint32_t telegram_recv_enable : 1; // bit 1 (v9.4.0.3) - CMND_TMSTATE 2/3 - Enable Telegram receive + uint32_t telegram_echo_enable : 1; // bit 2 (v9.4.0.3) - CMND_TMSTATE 4/5 - Enable Telegram echo + uint32_t spare03 : 1; // bit 3 + uint32_t spare04 : 1; // bit 4 + uint32_t spare05 : 1; // bit 5 + uint32_t spare06 : 1; // bit 6 + uint32_t spare07 : 1; // bit 7 + uint32_t spare08 : 1; // bit 8 + uint32_t spare09 : 1; // bit 9 + uint32_t spare10 : 1; // bit 10 + uint32_t spare11 : 1; // bit 11 + uint32_t spare12 : 1; // bit 12 + uint32_t spare13 : 1; // bit 13 + uint32_t spare14 : 1; // bit 14 + uint32_t spare15 : 1; // bit 15 + uint32_t spare16 : 1; // bit 16 + uint32_t spare17 : 1; // bit 17 + uint32_t spare18 : 1; // bit 18 + uint32_t spare19 : 1; // bit 19 + uint32_t spare20 : 1; // bit 20 + uint32_t spare21 : 1; // bit 21 + uint32_t spare22 : 1; // bit 22 + uint32_t spare23 : 1; // bit 23 + uint32_t spare24 : 1; // bit 24 + 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 spare30 : 1; // bit 30 + uint32_t spare31 : 1; // bit 31 + }; +} SBitfield1; + typedef union { uint16_t data; struct { @@ -400,7 +445,7 @@ struct { unsigned long version; // 008 uint16_t bootcount; // 00C uint16_t cfg_crc; // 00E - SysBitfield flag; // 010 + SOBitfield flag; // 010 int16_t save_data; // 014 int8_t timezone; // 016 @@ -472,7 +517,7 @@ struct { uint16_t blinktime; // 39A uint16_t blinkcount; // 39C uint16_t light_rotation; // 39E - SysBitfield3 flag3; // 3A0 + SOBitfield3 flag3; // 3A0 uint8_t ex_switchmode[8]; // 3A4 - Free since 9.2.0.6 @@ -651,7 +696,7 @@ struct { uint8_t ex_adc_param_type; // EF7 Free since 9.0.0.1 - SysBitfield4 flag4; // EF8 + SOBitfield4 flag4; // EF8 uint16_t mqtt_port; // EFC uint8_t serial_config; // EFE uint8_t wifi_output_power; // EFF @@ -694,14 +739,15 @@ struct { uint16_t shd_warmup_brightness; // F5C uint8_t shd_warmup_time; // F5E - uint8_t free_f5f[69]; // F5F - Decrement if adding new Setting variables just above and below + uint8_t free_f5f[65]; // F5F - Decrement if adding new Setting variables just above and below // Only 32 bit boundary variables below + SBitfield1 sbflag1; // FA0 TeleinfoCfg teleinfo; // FA4 uint64_t rf_protocol_mask; // FA8 uint8_t device_group_tie[4]; // FB0 - SysBitfield5 flag5; // FB4 + SOBitfield5 flag5; // FB4 uint16_t pulse_counter_debounce_low; // FB8 uint16_t pulse_counter_debounce_high; // FBA uint32_t keeloq_master_msb; // FBC diff --git a/tasmota/settings.ino b/tasmota/settings.ino index 5691f20a0..74e66166f 100644 --- a/tasmota/settings.ino +++ b/tasmota/settings.ino @@ -706,10 +706,10 @@ void SettingsDefaultSet2(void) { memset((char*)&Settings +16, 0x00, sizeof(Settings) -16); // this little trick allows GCC to optimize the assignment by grouping values and doing only ORs - SysBitfield flag = { 0 }; - SysBitfield3 flag3 = { 0 }; - SysBitfield4 flag4 = { 0 }; - SysBitfield5 flag5 = { 0 }; + SOBitfield flag = { 0 }; + SOBitfield3 flag3 = { 0 }; + SOBitfield4 flag4 = { 0 }; + SOBitfield5 flag5 = { 0 }; SysMBitfield1 flag2 = { 0 }; SysMBitfield2 mbflag2 = { 0 }; @@ -1259,6 +1259,9 @@ void SettingsDelta(void) { if (Settings.version < 0x09030104) { Settings.mbflag2.data = 0; } + if (Settings.version < 0x09040002) { + Settings.sbflag1.data = 0; + } Settings.version = VERSION; SettingsSave(1); diff --git a/tasmota/tasmota_version.h b/tasmota/tasmota_version.h index ed8d5d0f2..897dfde36 100644 --- a/tasmota/tasmota_version.h +++ b/tasmota/tasmota_version.h @@ -20,6 +20,6 @@ #ifndef _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_ -const uint32_t VERSION = 0x09040002; +const uint32_t VERSION = 0x09040003; #endif // _TASMOTA_VERSION_H_ diff --git a/tasmota/xdrv_40_telegram.ino b/tasmota/xdrv_40_telegram.ino index 8d1099fc1..66191c43f 100644 --- a/tasmota/xdrv_40_telegram.ino +++ b/tasmota/xdrv_40_telegram.ino @@ -78,9 +78,6 @@ struct { uint8_t retry = 0; uint8_t poll = TELEGRAM_LOOP_WAIT; uint8_t wait = 0; - bool send_enable = false; - bool recv_enable = false; - bool echo_enable = false; bool recv_busy = false; bool skip = true; // Skip first telegram if restarted } Telegram; @@ -317,7 +314,7 @@ String TelegramExecuteCommand(const char *svalue) { } void TelegramLoop(void) { - if (!TasmotaGlobal.global_state.network_down && (Telegram.recv_enable || Telegram.echo_enable)) { + if (!TasmotaGlobal.global_state.network_down && (Settings.sbflag1.telegram_recv_enable || Settings.sbflag1.telegram_echo_enable)) { switch (Telegram.state) { case 0: TelegramInit(); @@ -330,7 +327,7 @@ void TelegramLoop(void) { Telegram.state++; break; case 2: - if (Telegram.echo_enable) { + if (Settings.sbflag1.telegram_echo_enable) { if (Telegram.retry && (Telegram.index < Telegram.message_count)) { if (TelegramSendMessage(Telegram.message[Telegram.index].chat_id, Telegram.message[Telegram.index].text)) { Telegram.index++; @@ -391,21 +388,21 @@ void CmndTmState(void) { switch (XdrvMailbox.payload) { case 0: // Off case 1: // On - Telegram.send_enable = XdrvMailbox.payload &1; + Settings.sbflag1.telegram_send_enable = XdrvMailbox.payload &1; break; case 2: // Off case 3: // On - Telegram.recv_enable = XdrvMailbox.payload &1; + Settings.sbflag1.telegram_recv_enable = XdrvMailbox.payload &1; break; case 4: // Off case 5: // On - Telegram.echo_enable = XdrvMailbox.payload &1; + Settings.sbflag1.telegram_echo_enable = XdrvMailbox.payload &1; break; } } } snprintf_P (TasmotaGlobal.mqtt_data, sizeof(TasmotaGlobal.mqtt_data), PSTR("{\"%s\":{\"Send\":\"%s\",\"Receive\":\"%s\",\"Echo\":\"%s\"}}"), - XdrvMailbox.command, GetStateText(Telegram.send_enable), GetStateText(Telegram.recv_enable), GetStateText(Telegram.echo_enable)); + XdrvMailbox.command, GetStateText(Settings.sbflag1.telegram_send_enable), GetStateText(Settings.sbflag1.telegram_recv_enable), GetStateText(Settings.sbflag1.telegram_echo_enable)); } void CmndTmPoll(void) { @@ -433,7 +430,7 @@ void CmndTmChatId(void) { } void CmndTmSend(void) { - if (!Telegram.send_enable || !strlen(SettingsText(SET_TELEGRAM_CHATID))) { + if (!Settings.sbflag1.telegram_send_enable || !strlen(SettingsText(SET_TELEGRAM_CHATID))) { ResponseCmndFailed(); return; }