From 7c41b8f4352a5f1b4506113ebf97128c6acc4f85 Mon Sep 17 00:00:00 2001 From: VietDzung Date: Wed, 13 Dec 2023 16:49:02 +0700 Subject: [PATCH] ESP-32: Support set TX, RX pin in the web UI SETUP->OTHERS, you can set any compatible pin. --- README.md | 3 ++- main/config.h | 4 +-- main/html_pages.h | 8 ++++++ main/language_translations.h | 3 ++- main/languages/ca-ES.h | 2 ++ main/languages/da-DA.h | 4 ++- main/languages/de-DE.h | 4 ++- main/languages/en-GB.h | 2 ++ main/languages/es-ES.h | 4 ++- main/languages/fr-FR.h | 4 ++- main/languages/it-IT.h | 4 ++- main/languages/ja-JP.h | 4 ++- main/languages/vi-VN.h | 4 ++- main/languages/zh-CN.h | 4 ++- main/main.cpp | 52 +++++++++++++++++++++++------------- 15 files changed, 75 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index d6791b4..d1a4d49 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,8 @@ The software and hardware has been tested by the author for 5 years on the follo This circuit using by the author, here is some [boards](https://github.com/dzungpv/mitsubishi2MQTT/blob/master/hardware/Before_Install.jpg) before install. -You can also use ESP-32 module for more processing power. If using ESP-32 you can change default pins in config.h, by default app use TX pin 26 and RX pin 27 +You can also use ESP-32 module for more processing power. If using ESP-32 by default app use Serial (serial 0 port). +You can assign any compatible pin in the SETUP->OTHERS to use custom pin, example TX: 26, RX: 27, check ESP-32 manual for pin, when TX and RX set it will use Serial2 port. You can see more pictures in [`hardware`](https://github.com/dzungpv/mitsubishi2MQTT/tree/master/hardware) folder. *** diff --git a/main/config.h b/main/config.h index 678c270..72ea3f6 100644 --- a/main/config.h +++ b/main/config.h @@ -120,9 +120,9 @@ unsigned lastWifiScanMillis; const PROGMEM char *m2mqtt_version = "2023.12.2"; // Define global variables for files +int HP_TX = 0; // variable for the ESP32 custom TX pin, 0 is the defautl and it use hardware serial 0 +int HP_RX = 0; // variable for the ESP32 custom RX pin, 0 is the defautl and it use hardware serial 0 #ifdef ESP32 -#define HP_TX 26 // define the ESP32 custom TX pin -#define HP_RX 27 // define the ESP32 custom RX pin const PROGMEM char *wifi_conf = "/wifi.json"; const PROGMEM char *mqtt_conf = "/mqtt.json"; const PROGMEM char *unit_conf = "/unit.json"; diff --git a/main/html_pages.h b/main/html_pages.h index bae450b..7dea8a4 100644 --- a/main/html_pages.h +++ b/main/html_pages.h @@ -112,6 +112,14 @@ const char html_page_others[] PROGMEM = "" "" "

" + "

_TXT_TX_PIN_" + "
" + "" + "

" + "

_TXT_RX_PIN_" + "
" + "" + "

" "
" "" "" diff --git a/main/language_translations.h b/main/language_translations.h index af7c2b7..a732230 100644 --- a/main/language_translations.h +++ b/main/language_translations.h @@ -122,7 +122,8 @@ MAKE_WORD_TRANSLATION(txt_others_haauto, en::txt_others_haauto, vi::txt_others_h MAKE_WORD_TRANSLATION(txt_others_hatopic, en::txt_others_hatopic, vi::txt_others_hatopic, da::txt_others_hatopic, de::txt_others_hatopic, es::txt_others_hatopic, fr::txt_others_hatopic, it::txt_others_hatopic, ja::txt_others_hatopic, zh::txt_others_hatopic, ca::txt_others_hatopic) // TODO translate MAKE_WORD_TRANSLATION(txt_others_debug_packets, en::txt_others_debug_packets, vi::txt_others_debug_packets, da::txt_others_debug_packets, de::txt_others_debug_packets, es::txt_others_debug_packets, fr::txt_others_debug_packets, it::txt_others_debug_packets, ja::txt_others_debug_packets, zh::txt_others_debug_packets, ca::txt_others_debug_packets) // TODO translate MAKE_WORD_TRANSLATION(txt_others_debug_log, en::txt_others_debug_log, vi::txt_others_debug_log, da::txt_others_debug_log, de::txt_others_debug_log, es::txt_others_debug_log, fr::txt_others_debug_log, it::txt_others_debug_log, ja::txt_others_debug_log, zh::txt_others_debug_log, ca::txt_others_debug_log) // TODO translate - +MAKE_WORD_TRANSLATION(txt_others_tx_pin, en::txt_others_tx_pin, vi::txt_others_tx_pin, da::txt_others_tx_pin, de::txt_others_tx_pin, es::txt_others_tx_pin, fr::txt_others_tx_pin, it::txt_others_tx_pin, ja::txt_others_tx_pin, zh::txt_others_tx_pin, ca::txt_others_tx_pin) // TODO translate +MAKE_WORD_TRANSLATION(txt_others_rx_pin, en::txt_others_rx_pin, vi::txt_others_rx_pin, da::txt_others_rx_pin, de::txt_others_rx_pin, es::txt_others_rx_pin, fr::txt_others_rx_pin, it::txt_others_rx_pin, ja::txt_others_rx_pin, zh::txt_others_rx_pin, ca::txt_others_rx_pin) // TODO translate // Page Status MAKE_WORD_TRANSLATION(txt_status_title, en::txt_status_title, vi::txt_status_title, da::txt_status_title, de::txt_status_title, es::txt_status_title, fr::txt_status_title, it::txt_status_title, ja::txt_status_title, zh::txt_status_title, ca::txt_status_title) // TODO translate MAKE_WORD_TRANSLATION(txt_status_hvac, en::txt_status_hvac, vi::txt_status_hvac, da::txt_status_hvac, de::txt_status_hvac, es::txt_status_hvac, fr::txt_status_hvac, it::txt_status_hvac, ja::txt_status_hvac, zh::txt_status_hvac, ca::txt_status_hvac) // TODO translate diff --git a/main/languages/ca-ES.h b/main/languages/ca-ES.h index 681dfe1..d83a13e 100644 --- a/main/languages/ca-ES.h +++ b/main/languages/ca-ES.h @@ -92,6 +92,8 @@ namespace ca const char txt_others_hatopic[] PROGMEM = "HA tema d'autodescobriment"; const char txt_others_debug_packets[] PROGMEM = "MQTT topic debug packets"; const char txt_others_debug_log[] PROGMEM = "MQTT topic debug logs"; + const char txt_others_tx_pin[] PROGMEM = "TX pin (ESP32, 0 use Serial)"; + const char txt_others_rx_pin[] PROGMEM = "RX pin (ESP32, 0 use Serial)"; // Page Status const char txt_status_title[] PROGMEM = "Estat"; diff --git a/main/languages/da-DA.h b/main/languages/da-DA.h index 3a0dfe4..c08966e 100644 --- a/main/languages/da-DA.h +++ b/main/languages/da-DA.h @@ -91,7 +91,9 @@ namespace da const char txt_others_hatopic[] PROGMEM = "HA Autodiscovery topic"; const char txt_others_debug_packets[] PROGMEM = "MQTT topic debug packets"; const char txt_others_debug_log[] PROGMEM = "MQTT topic debug logs"; - + const char txt_others_tx_pin[] PROGMEM = "TX pin (ESP32, 0 use Serial)"; + const char txt_others_rx_pin[] PROGMEM = "RX pin (ESP32, 0 use Serial)"; + // Page Status const char txt_status_title[] PROGMEM = "Status"; const char txt_status_hvac[] PROGMEM = "HVAC Status"; diff --git a/main/languages/de-DE.h b/main/languages/de-DE.h index e7c0ced..eb1bacd 100644 --- a/main/languages/de-DE.h +++ b/main/languages/de-DE.h @@ -91,7 +91,9 @@ namespace de const char txt_others_hatopic[] PROGMEM = "HA Autodiscovery topic"; const char txt_others_debug_packets[] PROGMEM = "MQTT topic debug packets"; const char txt_others_debug_log[] PROGMEM = "MQTT topic debug logs"; - + const char txt_others_tx_pin[] PROGMEM = "TX pin (ESP32, 0 use Serial)"; + const char txt_others_rx_pin[] PROGMEM = "RX pin (ESP32, 0 use Serial)"; + // Page Status const char txt_status_title[] PROGMEM = "Status"; const char txt_status_hvac[] PROGMEM = "HVAC Status"; diff --git a/main/languages/en-GB.h b/main/languages/en-GB.h index a746d45..6e5dd47 100644 --- a/main/languages/en-GB.h +++ b/main/languages/en-GB.h @@ -92,6 +92,8 @@ namespace en const char txt_others_hatopic[] PROGMEM = "Autodiscovery topic"; const char txt_others_debug_packets[] PROGMEM = "MQTT debug packets"; const char txt_others_debug_log[] PROGMEM = "MQTT debug logs"; + const char txt_others_tx_pin[] PROGMEM = "TX pin (ESP32, 0 use Serial)"; + const char txt_others_rx_pin[] PROGMEM = "RX pin (ESP32, 0 use Serial)"; // Page Status const char txt_status_title[] PROGMEM = "Status"; diff --git a/main/languages/es-ES.h b/main/languages/es-ES.h index 03a28d4..8138d4e 100644 --- a/main/languages/es-ES.h +++ b/main/languages/es-ES.h @@ -92,7 +92,9 @@ namespace es const char txt_others_hatopic[] PROGMEM = "HA Autodiscovery topic"; const char txt_others_debug_packets[] PROGMEM = "MQTT topic debug packets"; const char txt_others_debug_log[] PROGMEM = "MQTT topic debug logs"; - + const char txt_others_tx_pin[] PROGMEM = "TX pin (ESP32, 0 use Serial)"; + const char txt_others_rx_pin[] PROGMEM = "RX pin (ESP32, 0 use Serial)"; + // Page Status const char txt_status_title[] PROGMEM = "Estado"; const char txt_status_hvac[] PROGMEM = "Estado HVAC"; diff --git a/main/languages/fr-FR.h b/main/languages/fr-FR.h index 26e6dc1..cec0b48 100644 --- a/main/languages/fr-FR.h +++ b/main/languages/fr-FR.h @@ -92,7 +92,9 @@ namespace fr const char txt_others_hatopic[] PROGMEM = "HA Topic Découverte automatique"; const char txt_others_debug_packets[] PROGMEM = "MQTT topic debug packets"; const char txt_others_debug_log[] PROGMEM = "MQTT topic debug logs"; - + const char txt_others_tx_pin[] PROGMEM = "TX pin (ESP32, 0 use Serial)"; + const char txt_others_rx_pin[] PROGMEM = "RX pin (ESP32, 0 use Serial)"; + // Page Status const char txt_status_title[] PROGMEM = "Etats"; const char txt_status_hvac[] PROGMEM = "Etat HVAC"; diff --git a/main/languages/it-IT.h b/main/languages/it-IT.h index 8d807e6..652dc2f 100644 --- a/main/languages/it-IT.h +++ b/main/languages/it-IT.h @@ -92,7 +92,9 @@ namespace it const char txt_others_hatopic[] PROGMEM = "HA Autodiscovery topic"; const char txt_others_debug_packets[] PROGMEM = "MQTT topic debug packets"; const char txt_others_debug_log[] PROGMEM = "MQTT topic debug logs"; - + const char txt_others_tx_pin[] PROGMEM = "TX pin (ESP32, 0 use Serial)"; + const char txt_others_rx_pin[] PROGMEM = "RX pin (ESP32, 0 use Serial)"; + // Page Status const char txt_status_title[] PROGMEM = "Stato"; const char txt_status_hvac[] PROGMEM = "Stato HVAC"; diff --git a/main/languages/ja-JP.h b/main/languages/ja-JP.h index 1abd1b5..1ed62de 100644 --- a/main/languages/ja-JP.h +++ b/main/languages/ja-JP.h @@ -92,7 +92,9 @@ namespace ja const char txt_others_hatopic[] PROGMEM = "HA自動検出トピック"; const char txt_others_debug_packets[] PROGMEM = "MQTT topic debug packets"; const char txt_others_debug_log[] PROGMEM = "MQTT topic debug logs"; - + const char txt_others_tx_pin[] PROGMEM = "TX pin (ESP32, 0 use Serial)"; + const char txt_others_rx_pin[] PROGMEM = "RX pin (ESP32, 0 use Serial)"; + // Page Status const char txt_status_title[] PROGMEM = "ステータス"; const char txt_status_hvac[] PROGMEM = "エアコン本体"; diff --git a/main/languages/vi-VN.h b/main/languages/vi-VN.h index 6e0ef59..58e776a 100644 --- a/main/languages/vi-VN.h +++ b/main/languages/vi-VN.h @@ -92,7 +92,9 @@ namespace vi const char txt_others_hatopic[] PROGMEM = "Chủ đề tự động khám phá"; const char txt_others_debug_packets[] PROGMEM = "MQTT gỡ lỗi gói tin"; const char txt_others_debug_log[] PROGMEM = "MQTT gỡ lỗi nhật ký"; - + const char txt_others_tx_pin[] PROGMEM = "Chân TX (ESP32, 0 dùng Serial)"; + const char txt_others_rx_pin[] PROGMEM = "Chân RX (ESP32, 0 dùng Serial)"; + // Page Status const char txt_status_title[] PROGMEM = "Trạng thái"; const char txt_status_hvac[] PROGMEM = "Trạng thái ĐH"; diff --git a/main/languages/zh-CN.h b/main/languages/zh-CN.h index 1fb22ce..54f9177 100644 --- a/main/languages/zh-CN.h +++ b/main/languages/zh-CN.h @@ -92,7 +92,9 @@ namespace zh const char txt_others_hatopic[] PROGMEM = "HA 自动发现主题"; const char txt_others_debug_packets[] PROGMEM = "MQTT topic debug packets"; const char txt_others_debug_log[] PROGMEM = "MQTT topic debug logs"; - + const char txt_others_tx_pin[] PROGMEM = "TX pin (ESP32, 0 use Serial)"; + const char txt_others_rx_pin[] PROGMEM = "RX pin (ESP32, 0 use Serial)"; + // Page Status const char txt_status_title[] PROGMEM = "状态"; const char txt_status_hvac[] PROGMEM = "空调状态"; diff --git a/main/main.cpp b/main/main.cpp index e120fd6..996c20b 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -30,9 +30,9 @@ bool loadMqtt(); bool loadUnit(); bool loadOthers(); void saveMqtt(String mqttFn, const String& mqttHost, String mqttPort, const String& mqttUser, const String& mqttPwd, String mqttTopic); -void saveUnit(String tempUnit, String supportMode, String loginPassword, String tempStep, String languageIndex); +void saveUnit(String tempUnit, String supportMode, String supportFanMode, String loginPassword, String tempStep, String languageIndex); void saveWifi(String apSsid, const String& apPwd, String hostName, const String& otaPwd); -void saveOthers(const String& haa, const String& haat, const String& debugPckts, const String& debugLogs); +void saveOthers(const String& haa, const String& haat, const String& debugPckts, const String& debugLogs, const String& txPin, const String& rxPin); void saveCurrentOthers(); void initCaptivePortal(); void initMqtt(); @@ -257,8 +257,15 @@ void setup() // Allow Remote/Panel hp.enableExternalUpdate(); hp.enableAutoUpdate(); -#if defined(ESP32) && defined(HP_TX) && defined(HP_RX) - hp.connect(&Serial2, HP_RX, HP_TX); +#if defined(ESP32) + if (HP_TX > 0 && HP_RX > 0) + { + hp.connect(&Serial2, HP_RX, HP_TX); + } + else + { + hp.connect(&Serial); + } #else hp.connect(&Serial); #endif @@ -522,7 +529,7 @@ bool loadOthers() return false; } // Allocate document capacity. - const size_t capacity = JSON_OBJECT_SIZE(4) + 200; + const size_t capacity = JSON_OBJECT_SIZE(6) + 300; DynamicJsonDocument doc(capacity); deserializeJson(doc, configFile); // unit @@ -545,6 +552,17 @@ bool loadOthers() { _debugModeLogs = true; } + // custom tx rx pin + if (doc.containsKey("txPin") && doc.containsKey("rxPin")) // check key to prevent data is "null" if not exist + { + String txPin = doc["txPin"].as(); + String rxPin = doc["rxPin"].as(); + if (!txPin.isEmpty() && !rxPin.isEmpty()) + { + HP_TX = atoi(txPin.c_str()); + HP_RX = atoi(rxPin.c_str()); + } + } return true; } @@ -646,15 +664,17 @@ void saveWifi(String apSsid, const String& apPwd, String hostName, const String& configFile.close(); } -void saveOthers(const String& haa, const String& haat, const String& debugPckts, const String& debugLogs) +void saveOthers(const String& haa, const String& haat, const String& debugPckts, const String& debugLogs, const String& txPin, const String& rxPin) { // Allocate document capacity. - const size_t capacity = JSON_OBJECT_SIZE(4) + 130; + const size_t capacity = JSON_OBJECT_SIZE(6) + 300; DynamicJsonDocument doc(capacity); doc["haa"] = haa; doc["haat"] = haat; doc["debugPckts"] = debugPckts; doc["debugLogs"] = debugLogs; + doc["txPin"] = txPin; + doc["rxPin"] = rxPin; File configFile = SPIFFS.open(others_conf, "w"); if (!configFile) { @@ -669,7 +689,7 @@ void saveCurrentOthers() String haa = others_haa ? "ON" : "OFF"; String debugPckts = _debugModePckts ? "ON" : "OFF"; String debugLogs = _debugModeLogs ? "ON" : "OFF"; - saveOthers(haa, others_haa_topic, debugPckts, debugLogs); + saveOthers(haa, others_haa_topic, debugPckts, debugLogs, String(HP_TX), String(HP_RX)); } // Initialize captive portal page @@ -1061,7 +1081,7 @@ void handleOthers(AsyncWebServerRequest *request) checkLogin(request); if (request->hasArg("save")) { - saveOthers(request->arg("HAA"), request->arg("haat"), request->arg("DebugPckts"), request->arg("DebugLogs")); + saveOthers(request->arg("HAA"), request->arg("haat"), request->arg("DebugPckts"), request->arg("DebugLogs"), request->arg("tx_pin"), request->arg("rx_pin")); String saveRebootPage = FPSTR(html_page_save_reboot); // localize saveRebootPage.replace("_TXT_M_SAVE_", translatedWord(FL_(txt_m_save))); @@ -1078,12 +1098,16 @@ void handleOthers(AsyncWebServerRequest *request) othersPage.replace("_TXT_OTHERS_HATOPIC_", translatedWord(FL_(txt_others_hatopic))); othersPage.replace("_TXT_OTHERS_DEBUG_PCKTS_", translatedWord(FL_(txt_others_debug_packets))); othersPage.replace("_TXT_OTHERS_DEBUG_LOGS_", translatedWord(FL_(txt_others_debug_log))); + othersPage.replace("_TXT_TX_PIN_", translatedWord(FL_(txt_others_tx_pin))); + othersPage.replace("_TXT_RX_PIN_", translatedWord(FL_(txt_others_rx_pin))); othersPage.replace("_TXT_F_ON_", translatedWord(FL_(txt_f_on))); othersPage.replace("_TXT_F_OFF_", translatedWord(FL_(txt_f_off))); othersPage.replace("_TXT_SAVE_", translatedWord(FL_(txt_save))); othersPage.replace("_TXT_BACK_", translatedWord(FL_(txt_back))); // set data othersPage.replace("_HAA_TOPIC_", others_haa_topic); + othersPage.replace("_TX_PIN_", String(HP_TX)); + othersPage.replace("_RX_PIN_", String(HP_RX)); if (others_haa) { othersPage.replace("_HAA_ON_", "selected"); @@ -2175,16 +2199,6 @@ void sendKeepAlive() if (_debugModeLogs) mqttClient.publish(ha_debug_logs_topic.c_str(), 1, false, (char *)"Failed to publish avialable status"); } - // send up time - rootInfo["upTime"] = getUpTime(); - String mqttOutput; - serializeJson(rootInfo, mqttOutput); - if (!mqttClient.publish(ha_state_topic.c_str(), 1, false, mqttOutput.c_str())) - { - if (_debugModeLogs) - mqttClient.publish(ha_debug_logs_topic.c_str(), 1, false, (char *)("Failed to publish up time")); - } - mqttOutput = ""; } void hpPacketDebug(byte *packet, unsigned int length, const char *packetDirection)