diff --git a/tasmota/settings.h b/tasmota/settings.h index 09b09b455..3b409b6bd 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -673,7 +673,7 @@ typedef struct { uint8_t ota_loader; // 293 unsigned long energy_kWhtoday; // 294 unsigned long energy_kWhtotal; // 298 - volatile unsigned long pulse_counter[MAX_COUNTERS]; // 29C + volatile unsigned long pulse_counter[MAX_COUNTERS]; // 29C - See #9521 why volatile power_t power; // 2AC EnergyUsage energy_usage; // 2B0 unsigned long nextwakeup; // 2C8 diff --git a/tasmota/xdrv_40_telegram.ino b/tasmota/xdrv_40_telegram.ino index 886dab64f..ddec0b3fb 100644 --- a/tasmota/xdrv_40_telegram.ino +++ b/tasmota/xdrv_40_telegram.ino @@ -26,7 +26,7 @@ * TmChatId <chat_id> - Add your BotFather created bot chat id (default none) * TmPoll <seconds> - Telegram receive poll time (default 10 seconds) * TmState 0 - Disable telegram sending (default) - * TmState 1 - Enable telegram sending + * TmState 1 - Enable telegram sending (needs valid TmChatId) * TmState 2 - Disable telegram listener (default) * TmState 3 - Enable telegram listener * TmState 4 - Disable telegram response echo (default) @@ -40,9 +40,11 @@ #define XDRV_40 40 -#define TELEGRAM_SEND_RETRY 4 // Retries +#ifndef TELEGRAM_LOOP_WAIT #define TELEGRAM_LOOP_WAIT 10 // Seconds +#endif +#define TELEGRAM_SEND_RETRY 4 // Retries #define TELEGRAM_MAX_MESSAGES 2 #ifdef USE_MQTT_TLS_CA_CERT @@ -58,10 +60,19 @@ BearSSL::WiFiClientSecure_light *telegramClient = nullptr; static const uint8_t Telegram_Fingerprint[] PROGMEM = USE_TELEGRAM_FINGERPRINT; +typedef struct { + String text; +// String from_first_name; +// String from_last_name; +// uint32_t from_id = 0; + uint32_t update_id = 0; + uint32_t chat_id = 0; +} TelegramMessage; + struct { - String message[TELEGRAM_MAX_MESSAGES][6]; // Amount of messages read per time (update_id, name_id, name, lastname, chat_id, text) - uint32_t message_id = 0; - uint8_t message_count = 0; + TelegramMessage message[TELEGRAM_MAX_MESSAGES]; + uint32_t next_update_id = 0; + uint8_t message_count = 0; // Amount of messages read per time uint8_t state = 0; uint8_t index = 0; uint8_t retry = 0; @@ -71,7 +82,7 @@ struct { bool recv_enable = false; bool echo_enable = false; bool recv_busy = false; - bool skip = true; // Skip first telegram if restarted + bool skip = true; // Skip first telegram if restarted } Telegram; bool TelegramInit(void) { @@ -84,14 +95,12 @@ bool TelegramInit(void) { #else telegramClient->setPubKeyFingerprint(Telegram_Fingerprint, Telegram_Fingerprint, false); // check server fingerprint #endif - - Telegram.message_count = 0; // Number of received messages - Telegram.message_id = 0; // Code of last read Message - Telegram.message[0][0] = ""; + Telegram.message_count = 0; // Number of received messages + Telegram.next_update_id = 0; // Code of last read Message + Telegram.message[0].text = ""; AddLog_P2(LOG_LEVEL_INFO, PSTR("TGM: Started")); } - init_done = true; } return init_done; @@ -104,13 +113,12 @@ String TelegramConnectToTelegram(String command) { String response = ""; uint32_t tls_connect_time = millis(); - if (telegramClient->connect("api.telegram.org", 443)) { + // AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TGM: Connected in %d ms, max ThunkStack used %d"), millis() - tls_connect_time, telegramClient->getMaxThunkStackUse()); telegramClient->println("GET /"+command); - String a = ""; char c; int ch_count=0; uint32_t now = millis(); @@ -118,7 +126,7 @@ String TelegramConnectToTelegram(String command) { while (millis() -now < 1500) { while (telegramClient->available()) { char c = telegramClient->read(); - if (ch_count < 700) { + if (ch_count < 700) { // Allow up to two messages response = response + c; ch_count++; } @@ -211,7 +219,7 @@ void TelegramGetUpdates(uint32_t offset) { Telegram.message_count = 0; // Returns how many messages are in the array if (max_updates) { for (uint32_t i = 0; i < max_updates; i++) { - Telegram.message[i][5] = ""; // Reset command + Telegram.message[i].text = ""; // Reset command JsonParserObject result = arr[i].getObject(); if (result) { // {"update_id":14354450, @@ -221,28 +229,26 @@ void TelegramGetUpdates(uint32_t offset) { // "date":1602346120, // "text":"Status 1"}} Telegram.message_count++; // Returns how many messages are in the array - Telegram.message[i][0] = result["update_id"].getStr(); -// Telegram.message[i][1] = result["message"].getObject()["from"].getObject()["id"].getStr(); -// Telegram.message[i][2] = result["message"].getObject()["from"].getObject()["first_name"].getStr(); -// Telegram.message[i][3] = result["message"].getObject()["from"].getObject()["last_name"].getStr(); - Telegram.message[i][4] = result["message"].getObject()["chat"].getObject()["id"].getStr(); - Telegram.message[i][5] = result["message"].getObject()["text"].getStr(); + Telegram.message[i].update_id = result["update_id"].getUInt(); +// Telegram.message[i].from_id = result["message"].getObject()["from"].getObject()["id"].getUInt(); +// Telegram.message[i].from_first_name = result["message"].getObject()["from"].getObject()["first_name"].getStr(); +// Telegram.message[i].from_last_name = result["message"].getObject()["from"].getObject()["last_name"].getStr(); + Telegram.message[i].chat_id = result["message"].getObject()["chat"].getObject()["id"].getUInt(); + Telegram.message[i].text = result["message"].getObject()["text"].getStr(); } - Telegram.message_id = Telegram.message[i][0].toInt() +1; // Write id of last read message + Telegram.next_update_id = Telegram.message[i].update_id +1; // Write id of last read message -// for (uint32_t j = 0; j < 6; j++) { -// AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("TGM: Parsed%d \"%s\""), j, Telegram.message[i][j].c_str()); -// } + AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("TGM: Parsed update_id %d, chat_id %d, text \"%s\""), Telegram.message[i].update_id, Telegram.message[i].chat_id, Telegram.message[i].text.c_str()); } } else { - AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TGM: No new messages")); +// AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TGM: No new messages")); } } else { - AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TGM: Failed to update")); +// AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TGM: Failed to update")); } } -bool TelegramSendMessage(String chat_id, String text) { +bool TelegramSendMessage(uint32_t chat_id, String text) { AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("TGM: sendMessage")); if (!TelegramInit()) { return false; } @@ -250,7 +256,7 @@ bool TelegramSendMessage(String chat_id, String text) { bool sent = false; if (text != "") { String _token = SettingsText(SET_TELEGRAM_TOKEN); - String command = "bot" + _token + "/sendMessage?chat_id=" + chat_id + "&text=" + text; + String command = "bot" + _token + "/sendMessage?chat_id=" + String(chat_id) + "&text=" + text; String response = TelegramConnectToTelegram(command); // AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("TGM: Response %s"), response.c_str()); @@ -259,7 +265,6 @@ bool TelegramSendMessage(String chat_id, String text) { // AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TGM: Message sent")); sent = true; } - } return sent; @@ -327,7 +332,7 @@ void TelegramLoop(void) { Telegram.state++; break; case 1: - TelegramGetUpdates(Telegram.message_id); // Launch API GetUpdates up to xxx message + TelegramGetUpdates(Telegram.next_update_id); // Launch API GetUpdates up to xxx message Telegram.index = 0; Telegram.retry = TELEGRAM_SEND_RETRY; Telegram.state++; @@ -335,7 +340,7 @@ void TelegramLoop(void) { case 2: if (Telegram.echo_enable) { if (Telegram.retry && (Telegram.index < Telegram.message_count)) { - if (TelegramSendMessage(Telegram.message[Telegram.index][4], Telegram.message[Telegram.index][5])) { + if (TelegramSendMessage(Telegram.message[Telegram.index].chat_id, Telegram.message[Telegram.index].text)) { Telegram.index++; Telegram.retry = TELEGRAM_SEND_RETRY; } else { @@ -350,10 +355,10 @@ void TelegramLoop(void) { if (Telegram.skip) { // Skip first update after restart as it may be a restart (again) Telegram.skip = false; } else { - if (Telegram.message_count && (Telegram.message[Telegram.index][5].length() > 0)) { - String logging = TelegramExecuteCommand(Telegram.message[Telegram.index][5].c_str()); + if (Telegram.message_count && (Telegram.message[Telegram.index].text.length() > 0)) { + String logging = TelegramExecuteCommand(Telegram.message[Telegram.index].text.c_str()); if (logging.length() > 0) { - TelegramSendMessage(Telegram.message[Telegram.index][4], logging); + TelegramSendMessage(Telegram.message[Telegram.index].chat_id, logging); } } } @@ -443,7 +448,7 @@ void CmndTmSend(void) { if (XdrvMailbox.data_len > 0) { String message = XdrvMailbox.data; String chat_id = SettingsText(SET_TELEGRAM_CHATID); - if (!TelegramSendMessage(chat_id, message)) { + if (!TelegramSendMessage(chat_id.toInt(), message)) { ResponseCmndChar(D_JSON_FAILED); return; }