mirror of https://github.com/arendst/Tasmota.git
Make Telegram command ``TmState`` persistent
Make Telegram command ``TmState`` persistent (#11965)
This commit is contained in:
parent
9f9625ac5c
commit
86ec4af6c5
|
@ -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":"<any template related command>|<any template related command>|..."`` (#11788)
|
||||
- ESP32 pulldown buttons ``Button_d`` and ``Button_id`` and switches ``Switch_d`` (#10814)
|
||||
|
|
|
@ -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":"<any template related command>|<any template related command>|..."`` [#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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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_
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue