From 700b5d4ff21d5ba83282338fa9c50d8a30984632 Mon Sep 17 00:00:00 2001 From: xyzroe Date: Sat, 8 Jun 2024 23:27:04 +0200 Subject: [PATCH 1/9] 20240609 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Update en.json #69 Thanks @SAOPP 🏆 - Update cz.json #67 Thanks @leroyloren 🏆 - Update build_fw.yml --- src/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/version.h b/src/version.h index 080a5ef..c103f47 100644 --- a/src/version.h +++ b/src/version.h @@ -1,4 +1,4 @@ // AUTO GENERATED FILE #ifndef VERSION - #define VERSION "20240608" + #define VERSION "20240609" #endif From bca3d1ecab18986fb7fea1f4fe5f556f8c1939a7 Mon Sep 17 00:00:00 2001 From: xyzroe Date: Sat, 8 Jun 2024 23:35:57 +0200 Subject: [PATCH 2/9] Fix outputs first work pass to second one --- .github/workflows/build_fw.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_fw.yml b/.github/workflows/build_fw.yml index 4895f8b..cf009ef 100644 --- a/.github/workflows/build_fw.yml +++ b/.github/workflows/build_fw.yml @@ -12,6 +12,9 @@ on: jobs: build_release_push: runs-on: ubuntu-latest + outputs: + tag: ${{ steps.get_tag.outputs.tag }} + commit_message: ${{ steps.get_commit_message.outputs.commit_message }} steps: - name: Clone repository uses: actions/checkout@v3 @@ -72,6 +75,7 @@ jobs: echo "commitMessage<> $GITHUB_ENV printf "%s\n" "$commitMessage" >> $GITHUB_ENV echo "EOF" >> $GITHUB_ENV + echo "commit_message=$commitMessage" >> $GITHUB_OUTPUT env: GITHUB_REF: ${{ github.ref }} @@ -144,13 +148,13 @@ jobs: token: ${{ secrets.TELEGRAM_BOT_TOKEN }} format: markdown message: | - ${{ env.commitMessage }} + ${{ needs.build_release_push.outputs.commit_message }} - [${{ steps.get_tag.outputs.tag }}](https://github.com/${{ github.repository }}/releases/tag/${{ steps.get_tag.outputs.tag }}) + [${{ needs.build_release_push.outputs.tag }}](https://github.com/${{ github.repository }}/releases/tag/${{ needs.build_release_push.outputs.tag }}) - name: Send Discord Notification about release run: | - json_payload=$(jq -n --arg content "https://github.com/${{ github.repository }}/releases/tag/${{ steps.get_tag.outputs.tag }}" '{content: $content}') + json_payload=$(jq -n --arg content "https://github.com/${{ github.repository }}/releases/tag/${{ needs.build_release_push.outputs.tag }}" '{content: $content}') curl -H "Content-Type: application/json" \ -d "$json_payload" \ ${{ secrets.DISCORD_WEBHOOK }} From 4ed8a104a89ab0b5981a1e0476930ba5633e523b Mon Sep 17 00:00:00 2001 From: xyzroe Date: Sun, 9 Jun 2024 17:39:01 +0200 Subject: [PATCH 3/9] 20240609.1 - Add detection of Zigbee role if none was previously selected. - Fix "no ETH" hardware boards hangs during boot. - Fix startup update check over WiFi (only when network is ready). - Fix small network errors in USB mode. - Enhance board configuration process: if multiple configurations are found, use the name Multi_X. - Add modal window on the root page to choose the device model when the board name is Multi_X. --- src/config.h | 2 + src/const/hw.cpp | 3 +- src/etc.cpp | 200 +++++++++++++++++------------- src/etc.h | 2 +- src/main.cpp | 44 +++++-- src/mqtt.cpp | 89 ++++++------- src/web.cpp | 95 ++++++++++++-- src/websrc/html/PAGE_NETWORK.html | 2 +- src/websrc/js/functions.js | 53 +++++++- src/websrc/json/en.json | 4 + 10 files changed, 342 insertions(+), 152 deletions(-) diff --git a/src/config.h b/src/config.h index 910a270..53f27f7 100644 --- a/src/config.h +++ b/src/config.h @@ -108,6 +108,8 @@ struct SysVarsStruct bool updateZbAvail; IPAddress savedWifiDNS; IPAddress savedEthDNS; + + bool firstUpdCheck = false; }; // Network configuration structure diff --git a/src/const/hw.cpp b/src/const/hw.cpp index 4a1bec5..602815d 100644 --- a/src/const/hw.cpp +++ b/src/const/hw.cpp @@ -6,7 +6,6 @@ EthConfig ethConfigs[] = { {.addr = 0, .pwrPin = 12, .mdcPin = 23, .mdiPin = 18, .phyType = ETH_PHY_LAN8720, .clkMode = ETH_CLOCK_GPIO17_OUT}, // .pwrAltPin = -1}, // 0 Olimex-ESP32-POE {.addr = 1, .pwrPin = 16, .mdcPin = 23, .mdiPin = 18, .phyType = ETH_PHY_LAN8720, .clkMode = ETH_CLOCK_GPIO0_IN}, // .pwrAltPin = -1}, // 1 WT32-ETH01 {.addr = 0, .pwrPin = 5, .mdcPin = 23, .mdiPin = 18, .phyType = ETH_PHY_LAN8720, .clkMode = ETH_CLOCK_GPIO17_OUT}, // .pwrAltPin = -1}, // 2 T-Internet-POE / UZG01 / HamGeek POE Plus - // {.addr = 0, .pwrPin = 5, .mdcPin = 23, .mdiPin = 18, .phyType = ETH_PHY_LAN8720, .clkMode = ETH_CLOCK_GPIO17_OUT}, // .pwrAltPin = -1}, // 3 HamGeek POE Plus }; // ZigBee configurations @@ -47,5 +46,5 @@ BrdConfigStruct brdConfigs[] = { {"TubesZB-poe-2023", .ethConfigIndex = 0, .zbConfigIndex = 6, .mistConfigIndex = 0}, // 10 {"CZC-1.0", .ethConfigIndex = 2, .zbConfigIndex = 0, .mistConfigIndex = 1}, // 11 {"SLS-classic", .ethConfigIndex = -1, .zbConfigIndex = 7, .mistConfigIndex = 3}, // 12 - {"HG POE+", .ethConfigIndex = 2, .zbConfigIndex = 0, .mistConfigIndex = 1}, // 13 + {"HG POE Plus", .ethConfigIndex = 2, .zbConfigIndex = 0, .mistConfigIndex = 1}, // 13 }; \ No newline at end of file diff --git a/src/etc.cpp b/src/etc.cpp index bce72ac..7063a62 100644 --- a/src/etc.cpp +++ b/src/etc.cpp @@ -400,7 +400,7 @@ void nmDeactivate() setLedsDisable(); } -void checkDNS(bool setup) +bool checkDNS(bool setup) { const char *wifiKey = "WiFi"; const char *ethKey = "ETH"; @@ -482,6 +482,7 @@ void checkDNS(bool setup) } } } + return true; } /*void reCheckDNS() @@ -491,7 +492,7 @@ void checkDNS(bool setup) void setupCron() { - //Cron.create(const_cast("30 */1 * * * *"), reCheckDNS, false); + // Cron.create(const_cast("30 */1 * * * *"), reCheckDNS, false); // const String time = systemCfg.updCheckTime; static char formattedTime[16]; @@ -627,7 +628,7 @@ ThisConfigStruct *findBrdConfig(int searchId = 0) bool zbOk = false; static ThisConfigStruct bestConfig; - bestConfig.eth = {.addr = -1, .pwrPin = -1, .mdcPin = -1, .mdiPin = -1, .phyType = ETH_PHY_LAN8720, .clkMode = ETH_CLOCK_GPIO17_OUT};// .pwrAltPin = -1}; + bestConfig.eth = {.addr = -1, .pwrPin = -1, .mdcPin = -1, .mdiPin = -1, .phyType = ETH_PHY_LAN8720, .clkMode = ETH_CLOCK_GPIO17_OUT}; // .pwrAltPin = -1}; bestConfig.zb = {.txPin = -1, .rxPin = -1, .rstPin = -1, .bslPin = -1}; memset(&bestConfig.mist, -1, sizeof(bestConfig.mist)); strlcpy(bestConfig.board, "Unknown", sizeof(bestConfig.board)); @@ -640,7 +641,7 @@ ThisConfigStruct *findBrdConfig(int searchId = 0) LOGI("Try brd: %d - %s", brdIdx, brdConfigs[brdIdx].board); - if (brdIdx == 3) // T-Internet-POE + /*if (brdIdx == 3) // T-Internet-POE { pinMode(ethConfigs[ethIdx].pwrPin, OUTPUT); delay(50); @@ -654,69 +655,99 @@ ThisConfigStruct *findBrdConfig(int searchId = 0) LOGW("%s", "Looks like not T-Internet-POE!"); continue; } - } + }*/ - if (ETH.begin(ethConfigs[ethIdx].addr, ethConfigs[ethIdx].pwrPin, ethConfigs[ethIdx].mdcPin, ethConfigs[ethIdx].mdiPin, ethConfigs[ethIdx].phyType, ethConfigs[ethIdx].clkMode))// ethConfigs[ethIdx].pwrAltPin)) + if (ethIdx == -1) + { + ethOk = true; + LOGD("NO ethernet OK: %d", ethIdx); + } + else if (ETH.begin(ethConfigs[ethIdx].addr, ethConfigs[ethIdx].pwrPin, ethConfigs[ethIdx].mdcPin, ethConfigs[ethIdx].mdiPin, ethConfigs[ethIdx].phyType, ethConfigs[ethIdx].clkMode)) // ethConfigs[ethIdx].pwrAltPin)) { ethOk = true; - LOGD("Ethernet config OK: %d", ethIdx); - bestConfig.eth = ethConfigs[ethIdx]; + LOGD("Ethernet config OK: %d", ethIdx); + } - if (mistConfigs[mistIdx].btnPin > 0) + if (mistConfigs[mistIdx].btnPin > 0) + { + pinMode(mistConfigs[mistIdx].btnPin, INPUT); + int press = 0; + for (int y = 0; y < 10; y++) { - pinMode(mistConfigs[mistIdx].btnPin, INPUT); - int press = 0; - for (int y = 0; y < 10; y++) + int state = digitalRead(mistConfigs[mistIdx].btnPin); + if (state != mistConfigs[mistIdx].btnPlr) { - int state = digitalRead(mistConfigs[mistIdx].btnPin); - if (state != mistConfigs[mistIdx].btnPlr) - { - press++; - } - delay(100); + press++; } - btnOk = (press <= 5); + delay(100); + } + btnOk = (press <= 5); - if (!btnOk) - { - LOGD("Button pin ERROR"); - ethOk = false; - } - else - { - LOGD("Button pin OK"); - } + if (!btnOk) + { + LOGD("Button pin ERROR"); + ethOk = false; } else { - btnOk = true; + LOGD("Button pin OK"); } + } + else + { + btnOk = true; + } - if (btnOk) - { - LOGD("Trying Zigbee: %d", zbIdx); - esp_task_wdt_reset(); - Serial2.begin(systemCfg.serialSpeed, SERIAL_8N1, zbConfigs[zbIdx].rxPin, zbConfigs[zbIdx].txPin); + if (btnOk) + { + LOGD("Trying Zigbee: %d", zbIdx); + esp_task_wdt_reset(); + Serial2.begin(systemCfg.serialSpeed, SERIAL_8N1, zbConfigs[zbIdx].rxPin, zbConfigs[zbIdx].txPin); - int BSL_PIN_MODE = 0; - if (CCTool.begin(zbConfigs[zbIdx].rstPin, zbConfigs[zbIdx].bslPin, BSL_PIN_MODE)) + int BSL_PIN_MODE = 0; + if (CCTool.begin(zbConfigs[zbIdx].rstPin, zbConfigs[zbIdx].bslPin, BSL_PIN_MODE)) + { + if (CCTool.detectChipInfo()) { - if (CCTool.detectChipInfo()) - { - zbOk = true; - LOGD("Zigbee config OK: %d", zbIdx); + zbOk = true; + LOGD("Zigbee config OK: %d", zbIdx); + + bestConfig.zb = zbConfigs[zbIdx]; + bestConfig.mist = mistConfigs[mistIdx]; - bestConfig.zb = zbConfigs[zbIdx]; - bestConfig.mist = mistConfigs[mistIdx]; - strlcpy(bestConfig.board, brdConfigs[brdIdx].board, sizeof(bestConfig.board)); - return &bestConfig; + bool multiCfg = false; + int brdNewId = -1; + for (int brdNewIdx = 0; brdNewIdx < BOARD_CFG_CNT; brdNewIdx++) + { + LOGD("%d %d", brdIdx, brdNewIdx); + if (brdIdx != brdNewIdx && brdConfigs[brdNewIdx].ethConfigIndex == ethIdx && brdConfigs[brdNewIdx].zbConfigIndex == zbIdx && brdConfigs[brdNewIdx].mistConfigIndex == mistIdx) + { + multiCfg = true; + brdNewId = brdNewIdx; + break; + } + } + const char *nameBrd; + if (!multiCfg) + { + nameBrd = brdConfigs[brdIdx].board; + strlcpy(bestConfig.board, nameBrd, sizeof(bestConfig.board)); } else { - zbOk = false; - LOGD("Zigbee config ERROR"); + String nameBrdStr = ("Multi_" + String(brdNewId)); + nameBrd = nameBrdStr.c_str(); + // LOGW("%s", nameBrdStr); + strlcpy(bestConfig.board, nameBrd, sizeof(bestConfig.board)); } + + return &bestConfig; + } + else + { + zbOk = false; + LOGD("Zigbee config ERROR"); } } } @@ -960,47 +991,50 @@ int compareVersions(String v1, String v2) void checkUpdateAvail() { - const char *ESPkey = "ESP"; - const char *ZBkey = "ZB"; - const char *FoundKey = "Found "; - const char *NewFwKey = " new fw: "; - const char *TryKey = "try to install"; - String latestReleaseUrlEsp = fetchLatestEspFw(); - String latestReleaseUrlZb = fetchLatestZbFw(); - String latestVersionEsp = extractVersionFromURL(latestReleaseUrlEsp); - String latestVersionZb = extractVersionFromURL(latestReleaseUrlZb); - - LOGD("%s %s", ESPkey, latestVersionEsp.c_str()); - LOGD("%s %s", ZBkey, latestVersionZb.c_str()); - - if (latestVersionEsp.length() > 0 && compareVersions(latestVersionEsp, VERSION) > 0) - { - vars.updateEspAvail = true; - printLogMsg(String(FoundKey) + String(ESPkey) + String(NewFwKey) + latestVersionEsp); - if (systemCfg.updAutoInst) + if (!vars.apStarted) + { + const char *ESPkey = "ESP"; + const char *ZBkey = "ZB"; + const char *FoundKey = "Found "; + const char *NewFwKey = " new fw: "; + const char *TryKey = "try to install"; + String latestReleaseUrlEsp = fetchLatestEspFw(); + String latestReleaseUrlZb = fetchLatestZbFw(); + String latestVersionEsp = extractVersionFromURL(latestReleaseUrlEsp); + String latestVersionZb = extractVersionFromURL(latestReleaseUrlZb); + + LOGD("%s %s", ESPkey, latestVersionEsp.c_str()); + LOGD("%s %s", ZBkey, latestVersionZb.c_str()); + + if (latestVersionEsp.length() > 0 && compareVersions(latestVersionEsp, VERSION) > 0) { - printLogMsg(String(TryKey)); - getEspUpdate(latestReleaseUrlEsp); + vars.updateEspAvail = true; + printLogMsg(String(FoundKey) + String(ESPkey) + String(NewFwKey) + latestVersionEsp); + if (systemCfg.updAutoInst) + { + printLogMsg(String(TryKey)); + getEspUpdate(latestReleaseUrlEsp); + } + } + else + { + vars.updateEspAvail = false; } - } - else - { - vars.updateEspAvail = false; - } - if (CCTool.chip.fwRev > 0 && latestVersionZb.length() > 0 && compareVersions(latestVersionZb, String(CCTool.chip.fwRev)) > 0) - { - vars.updateZbAvail = true; - printLogMsg(String(FoundKey) + String(ZBkey) + String(NewFwKey) + latestVersionZb); - if (systemCfg.updAutoInst) + if (CCTool.chip.fwRev > 0 && latestVersionZb.length() > 0 && compareVersions(latestVersionZb, String(CCTool.chip.fwRev)) > 0) { - printLogMsg(String(TryKey)); - flashZbUrl(latestReleaseUrlZb); - ESP.restart(); + vars.updateZbAvail = true; + printLogMsg(String(FoundKey) + String(ZBkey) + String(NewFwKey) + latestVersionZb); + if (systemCfg.updAutoInst) + { + printLogMsg(String(TryKey)); + flashZbUrl(latestReleaseUrlZb); + ESP.restart(); + } + } + else + { + vars.updateZbAvail = false; } - } - else - { - vars.updateZbAvail = false; } } diff --git a/src/etc.h b/src/etc.h index ca6cd10..b343c1a 100644 --- a/src/etc.h +++ b/src/etc.h @@ -27,7 +27,7 @@ void factoryReset(); void setLedsDisable(bool all = false); void cronTest(); void nmActivate(); -void checkDNS(bool setup = false); +bool checkDNS(bool setup = false); void setupCron(); void setClock(void *pvParameters); diff --git a/src/main.cpp b/src/main.cpp index fd3e9b9..f153213 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -74,9 +74,9 @@ MDNSResponder mDNS; void initLan() { - LOGD("Try to use %s", hwConfig.board); + LOGD("Load cfg %s", hwConfig.board); - if (ETH.begin(hwConfig.eth.addr, hwConfig.eth.pwrPin, hwConfig.eth.mdcPin, hwConfig.eth.mdiPin, hwConfig.eth.phyType, hwConfig.eth.clkMode))// hwConfig.eth.pwrAltPin)) + if (ETH.begin(hwConfig.eth.addr, hwConfig.eth.pwrPin, hwConfig.eth.mdcPin, hwConfig.eth.mdiPin, hwConfig.eth.phyType, hwConfig.eth.clkMode)) // hwConfig.eth.pwrAltPin)) { String modeString = networkCfg.ethDhcp ? "DHCP" : "Static"; LOGD("LAN start ok, %s", modeString); @@ -158,8 +158,12 @@ void handleTmrNetworkOverseer() if (WiFi.isConnected()) { LOGD("WIFI CONNECTED"); - // startServers(); tmrNetworkOverseer.stop(); + if (!vars.firstUpdCheck) + { + checkUpdateAvail(); + vars.firstUpdCheck = true; + } } else { @@ -176,8 +180,12 @@ void handleTmrNetworkOverseer() if (vars.connectedEther) { LOGD("LAN CONNECTED"); - // startServers(); tmrNetworkOverseer.stop(); + if (!vars.firstUpdCheck) + { + checkUpdateAvail(); + vars.firstUpdCheck = true; + } } else { @@ -254,7 +262,7 @@ void NetworkEvent(WiFiEvent_t event) LOGD("%s Disconnected", ethKey); vars.connectedEther = false; // ConfigSettings.disconnectEthTime = millis(); - if (tmrNetworkOverseer.state() == STOPPED && systemCfg.workMode == WORK_MODE_NETWORK) + if (tmrNetworkOverseer.state() == STOPPED) //&& systemCfg.workMode == WORK_MODE_NETWORK) { tmrNetworkOverseer.start(); } @@ -523,6 +531,15 @@ void setup() loadFileConfigHW(); + if (hwConfig.eth.mdcPin == -1 || hwConfig.eth.mdiPin == -1) + { + if (networkCfg.ethEnable) + { + networkCfg.ethEnable = false; + saveNetworkConfig(networkCfg); + } + } + vars.apStarted = false; // AVOID USING PIN 0 @@ -580,18 +597,23 @@ void setup() printNVSFreeSpace(); - if (systemCfg.zbRole == COORDINATOR) + if (systemCfg.zbRole == COORDINATOR || systemCfg.zbRole == UNDEFINED) { - zbFwCheck(); + if (zbFwCheck()) + { + if (systemCfg.zbRole == UNDEFINED) + { + systemCfg.zbRole = COORDINATOR; + saveSystemConfig(systemCfg); + } + } } - else { + else + { LOGI("[ZB] role: %s", String(systemCfg.zbRole)); } LOGI("[ESP] FW: %s", String(VERSION)); - if (!vars.apStarted) - checkUpdateAvail(); - LOGD("done"); } diff --git a/src/mqtt.cpp b/src/mqtt.cpp index 479daa1..7e0089e 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -282,62 +282,63 @@ mqttTopicsConfig mqttTopicsConfigs[] = { void mqttConnectSetup() { LOGD("mqttConnectSetup"); - checkDNS(); - - if (mqttCfg.reconnectInt == 0) - { - mqttCfg.reconnectInt = 30; - LOGI("Reconnect Int didn't set. So use %d seconds", mqttCfg.reconnectInt); - } - if (mqttCfg.updateInt == 0) + if (checkDNS()) { - mqttCfg.updateInt = 60; - LOGI("Update Int didn't set. So use %d seconds", mqttCfg.updateInt); - } - mqttReconnectTimer = xTimerCreate("mqttReconnectTimer", pdMS_TO_TICKS(mqttCfg.reconnectInt * 1000), pdFALSE, (void *)0, reinterpret_cast(connectToMqtt)); - mqttPubStateTimer = xTimerCreate("mqttPubStateTimer", pdMS_TO_TICKS(mqttCfg.updateInt * 1000), pdFALSE, (void *)0, reinterpret_cast(mqttPublishState)); + if (mqttCfg.reconnectInt == 0) + { + mqttCfg.reconnectInt = 30; + LOGI("Reconnect Int didn't set. So use %d seconds", mqttCfg.reconnectInt); + } + if (mqttCfg.updateInt == 0) + { + mqttCfg.updateInt = 60; + LOGI("Update Int didn't set. So use %d seconds", mqttCfg.updateInt); + } + mqttReconnectTimer = xTimerCreate("mqttReconnectTimer", pdMS_TO_TICKS(mqttCfg.reconnectInt * 1000), pdFALSE, (void *)0, reinterpret_cast(connectToMqtt)); + mqttPubStateTimer = xTimerCreate("mqttPubStateTimer", pdMS_TO_TICKS(mqttCfg.updateInt * 1000), pdFALSE, (void *)0, reinterpret_cast(mqttPublishState)); - if (mqttReconnectTimer == NULL) - { - LOGD("Failed to create mqttReconnectTimer"); - } + if (mqttReconnectTimer == NULL) + { + LOGD("Failed to create mqttReconnectTimer"); + } - if (mqttPubStateTimer == NULL) - { - LOGD("Failed to create mqttPubStateTimer"); - } + if (mqttPubStateTimer == NULL) + { + LOGD("Failed to create mqttPubStateTimer"); + } - uint16_t keepAlive = mqttCfg.updateInt + 10; - mqttClient.setKeepAlive(keepAlive); + uint16_t keepAlive = mqttCfg.updateInt + 10; + mqttClient.setKeepAlive(keepAlive); - const char *clientId = vars.deviceId; - mqttClient.setClientId(clientId); + const char *clientId = vars.deviceId; + mqttClient.setClientId(clientId); - mqttClient.setCredentials(mqttCfg.user, mqttCfg.pass); + mqttClient.setCredentials(mqttCfg.user, mqttCfg.pass); - // String topic = String(mqttCfg.topic) + "/avty"; - // mqttClient.setWill(topic.c_str(), 1, true, "offline"); + // String topic = String(mqttCfg.topic) + "/avty"; + // mqttClient.setWill(topic.c_str(), 1, true, "offline"); - mqttClient.setServer(mqttCfg.server, mqttCfg.port); + mqttClient.setServer(mqttCfg.server, mqttCfg.port); - /* NO SSL SUPPORT in current SDK - #if ASYNC_TCP_SSL_ENABLED - mqttClient.setSecure(MQTT_SECURE); - if (MQTT_SECURE) - { - mqttClient.addServerFingerprint((const uint8_t[])MQTT_SERVER_FINGERPRINT); - } - #endif - */ + /* NO SSL SUPPORT in current SDK + #if ASYNC_TCP_SSL_ENABLED + mqttClient.setSecure(MQTT_SECURE); + if (MQTT_SECURE) + { + mqttClient.addServerFingerprint((const uint8_t[])MQTT_SERVER_FINGERPRINT); + } + #endif + */ - mqttClient.onConnect(onMqttConnect); - mqttClient.onDisconnect(onMqttDisconnect); + mqttClient.onConnect(onMqttConnect); + mqttClient.onDisconnect(onMqttDisconnect); - mqttClient.onMessage(onMqttMessage); + mqttClient.onMessage(onMqttMessage); - if (xTimerStart(mqttReconnectTimer, 0) != pdPASS) - { - LOGD("Failed to start timer"); + if (xTimerStart(mqttReconnectTimer, 0) != pdPASS) + { + LOGD("Failed to start timer"); + } } } diff --git a/src/web.cpp b/src/web.cpp index a4a3231..4d6c39a 100644 --- a/src/web.cpp +++ b/src/web.cpp @@ -479,7 +479,8 @@ void handleApi() CMD_ZB_LED_TOG, CMD_ESP_FAC_RES, CMD_ZB_ERASE_NVRAM, - CMD_DNS_CHECK + CMD_DNS_CHECK, + CMD_BRD_NAME }; String result = wrongArgs; const char *argCmd = "cmd"; @@ -624,6 +625,39 @@ void handleApi() } } break; + case CMD_BRD_NAME: + if (serverWeb.hasArg("board")) + { + String brdName = serverWeb.arg("board"); + brdName.toCharArray(hwConfig.board, sizeof(hwConfig.board)); + + File configFile = LittleFS.open(configFileHw, FILE_READ); + if (!configFile) + { + Serial.println("Failed to open config file for reading"); + return; + } + + DynamicJsonDocument config(1024); + DeserializationError error = deserializeJson(config, configFile); + if (error) + { + Serial.println("Failed to parse config file"); + configFile.close(); + return; + } + + configFile.close(); + config["board"] = hwConfig.board; + + writeDefaultConfig(configFileHw, config); + serverWeb.send(HTTP_CODE_OK, contTypeText, result); + } + else + { + serverWeb.send(HTTP_CODE_BAD_REQUEST, contTypeText, result); + } + break; default: serverWeb.send(HTTP_CODE_BAD_REQUEST, contTypeText, result); break; @@ -1082,8 +1116,8 @@ void handleGeneral() zonesArray.add(timeZones[i].zone); } - size_t usedMemory = zones.memoryUsage(); - LOGD("Zones used: %s bytes", String(usedMemory)); + // size_t usedMemory = zones.memoryUsage(); + // LOGD("Zones used: %s bytes", String(usedMemory)); serializeJson(zones, results); serverWeb.sendHeader(respTimeZonesName, results); @@ -1210,6 +1244,11 @@ void handleNetwork() break; } + if (hwConfig.eth.mdcPin == -1 || hwConfig.eth.mdiPin == -1) + { + doc["no_eth"] = 1; + } + serializeJson(doc, result); serverWeb.sendHeader(respHeaderName, result); } @@ -1388,7 +1427,7 @@ String getRootData(bool update) doc[ethIpKey] = ETH.localIP().toString(); doc[ethMaskKey] = ETH.subnetMask().toString(); doc[ethGateKey] = ETH.gatewayIP().toString(); - doc[ethDns] = vars.savedEthDNS.toString();//ETH.dnsIP().toString(); + doc[ethDns] = vars.savedEthDNS.toString(); // ETH.dnsIP().toString(); } else { @@ -1396,7 +1435,7 @@ String getRootData(bool update) doc[ethIpKey] = networkCfg.ethDhcp ? noConn : ETH.localIP().toString(); doc[ethMaskKey] = networkCfg.ethDhcp ? noConn : ETH.subnetMask().toString(); doc[ethGateKey] = networkCfg.ethDhcp ? noConn : ETH.gatewayIP().toString(); - doc[ethDns] = networkCfg.ethDhcp ? noConn : vars.savedEthDNS.toString();//ETH.dnsIP().toString(); + doc[ethDns] = networkCfg.ethDhcp ? noConn : vars.savedEthDNS.toString(); // ETH.dnsIP().toString(); } } @@ -1474,6 +1513,47 @@ String getRootData(bool update) if (!update) { doc["wifiMac"] = WiFi.macAddress(); + String boardStr = hwConfig.board; + if (boardStr.startsWith("Multi")) + { + int underscoreIndex = boardStr.indexOf('_'); + if (underscoreIndex != -1) + { + String boardNumber = boardStr.substring(underscoreIndex + 1); + boardNumber.trim(); + int boardNum = boardNumber.toInt(); + + String boardArray[BOARD_CFG_CNT]; + int arrayIndex = 0; + + for (int brdNewIdx = 0; brdNewIdx < BOARD_CFG_CNT; brdNewIdx++) + { + if (brdConfigs[brdNewIdx].ethConfigIndex == brdConfigs[boardNum].ethConfigIndex) + { + if (brdConfigs[brdNewIdx].zbConfigIndex == brdConfigs[boardNum].zbConfigIndex) + { + if (brdConfigs[brdNewIdx].mistConfigIndex == brdConfigs[boardNum].mistConfigIndex) + { + boardArray[arrayIndex++] = brdConfigs[brdNewIdx].board; + } + } + } + } + + DynamicJsonDocument jsonDoc(512); + JsonArray jsonArray = jsonDoc.to(); + + for (int i = 0; i < arrayIndex; i++) + { + jsonArray.add(boardArray[i]); + } + + String jsonString; + serializeJson(jsonArray, jsonString); + + doc["boardArray"] = jsonString; + } + } } if (networkCfg.wifiEnable) @@ -1488,7 +1568,7 @@ String getRootData(bool update) doc[wifiIpKey] = WiFi.localIP().toString(); doc[wifiMaskKey] = WiFi.subnetMask().toString(); doc[wifiGateKey] = WiFi.gatewayIP().toString(); - doc[wifiDns] = vars.savedWifiDNS.toString();//WiFi.dnsIP().toString(); + doc[wifiDns] = vars.savedWifiDNS.toString(); // WiFi.dnsIP().toString(); } else { @@ -1498,7 +1578,7 @@ String getRootData(bool update) doc[wifiIpKey] = networkCfg.wifiDhcp ? noConn : WiFi.localIP().toString(); doc[wifiMaskKey] = networkCfg.wifiDhcp ? noConn : WiFi.subnetMask().toString(); doc[wifiGateKey] = networkCfg.wifiDhcp ? noConn : WiFi.gatewayIP().toString(); - doc[wifiDns] = networkCfg.wifiDhcp ? noConn : vars.savedWifiDNS.toString();//WiFi.dnsIP().toString(); + doc[wifiDns] = networkCfg.wifiDhcp ? noConn : vars.savedWifiDNS.toString(); // WiFi.dnsIP().toString(); } } @@ -1688,7 +1768,6 @@ void progressNvRamFunc(unsigned int progress, unsigned int total) void progressFunc(unsigned int progress, unsigned int total) { - const uint8_t eventLen = 11; float percent = ((float)progress / total) * 100.0; diff --git a/src/websrc/html/PAGE_NETWORK.html b/src/websrc/html/PAGE_NETWORK.html index ccedb5f..9ec5948 100644 --- a/src/websrc/html/PAGE_NETWORK.html +++ b/src/websrc/html/PAGE_NETWORK.html @@ -1,6 +1,6 @@
-
+
diff --git a/src/websrc/js/functions.js b/src/websrc/js/functions.js index ee7d13c..86fa947 100644 --- a/src/websrc/js/functions.js +++ b/src/websrc/js/functions.js @@ -54,7 +54,8 @@ const commands = { CMD_ZB_LED_TOG: 12, CMD_ESP_FAC_RES: 13, CMD_ZB_ERASE_NVRAM: 14, - CMD_DNS_CHECK: 15 + CMD_DNS_CHECK: 15, + CMD_BRD_NAME: 16 } const api = { @@ -970,6 +971,12 @@ function dataReplace(values, navOnly = false) { if (property == "zbFwSaved" && values[property] == 1) { $('td[data-r2v="zigbeeFwRev"]').addClass('fst-italic'); } + if (property == "boardArray") { // && values[property].startsWith("Multi")) { + modalConstructor("multiCfg", values[property]); + } + if (property == "no_eth" && values[property] == 1) { + $('#ethCfg').hide(); + } //console.log($elements); $elements.map(function () { const elemType = $(this).prop('nodeName').toLowerCase(); @@ -1738,9 +1745,51 @@ function modalConstructor(type, params) { $(modalBtns).html(""); switch (type) { + case "multiCfg": + $(headerText).text(i18next.t('md.esp.mc.tt')).css("color", "yellow"); + $(modalBody).html(i18next.t("md.esp.mc.mi")); + console.log(params) + + const optionsArray = JSON.parse(params); + + const selectElement = document.createElement('select'); + selectElement.className = "form-select mt-2"; + + optionsArray.forEach(option => { + const optionElement = document.createElement('option'); + optionElement.value = option; + optionElement.textContent = option; + selectElement.appendChild(optionElement); + }); + + $(modalBody).append(selectElement); + + $('
", { + id: "bar", + text: i18next.t("md.esp.fu.wdm"), + class: "mb-2 text-sm-center" + }).appendTo(modalBody); + const selectedBoard = selectElement.value; + $.get(apiLink + api.actions.API_CMD + "&cmd=" + api.commands.CMD_BRD_NAME + "&board=" + selectedBoard, function () { + console.log("board: " + selectedBoard); + location.reload(); + }); + } + }).appendTo(modalBtns); + + modalAddCancel(); + break; case "flashESP": $.get(apiLink + api.actions.API_CMD + "&cmd=" + api.commands.CMD_DNS_CHECK); - $(headerText).text(i18next.t('md.esp.fu.tt')).css("color", "red");; + $(headerText).text(i18next.t('md.esp.fu.tt')).css("color", "red"); let action = 0; if (params instanceof FormData) { console.log("FormData received:", params); diff --git a/src/websrc/json/en.json b/src/websrc/json/en.json index fe269c5..c3401e4 100644 --- a/src/websrc/json/en.json +++ b/src/websrc/json/en.json @@ -392,6 +392,10 @@ "nip": "New IP address is {{ip}} Device will now reboot for the new settings to take effect.", "btn": "Go to", "err": "Connection error, check SSID, PASSWORD and try again" + }, + "mc": { + "tt": "Select your device model", + "mi": "More than one device with exactly your configuration is supported. You need to select your device." } }, "zb": { From 61ac03e4285572da39871a7357e4e5c91927d071 Mon Sep 17 00:00:00 2001 From: xyzroe Date: Sun, 9 Jun 2024 17:47:11 +0200 Subject: [PATCH 4/9] 20240609.1 - Fix workflow to use .txt for commit msg - Add detection of Zigbee role if none was previously selected. - Fix "no ETH" hardware boards hangs during boot. - Fix startup update check over WiFi (only when network is ready). - Fix small network errors in USB mode. - Enhance board configuration process: if multiple configurations are found, use the name Multi_X. - Add modal window on the root page to choose the device model when the board name is Multi_X. --- .github/workflows/build_fw.yml | 3 ++- src/version.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_fw.yml b/.github/workflows/build_fw.yml index cf009ef..940864c 100644 --- a/.github/workflows/build_fw.yml +++ b/.github/workflows/build_fw.yml @@ -75,7 +75,8 @@ jobs: echo "commitMessage<> $GITHUB_ENV printf "%s\n" "$commitMessage" >> $GITHUB_ENV echo "EOF" >> $GITHUB_ENV - echo "commit_message=$commitMessage" >> $GITHUB_OUTPUT + echo "${commitMessage}" > commit_message.txt + echo "commit_message=$(cat commit_message.txt)" >> $GITHUB_OUTPUT env: GITHUB_REF: ${{ github.ref }} diff --git a/src/version.h b/src/version.h index c103f47..b8d1988 100644 --- a/src/version.h +++ b/src/version.h @@ -1,4 +1,4 @@ // AUTO GENERATED FILE #ifndef VERSION - #define VERSION "20240609" + #define VERSION "20240609.1" #endif From 9bb0c265c3df93d19c1e5c7d5fc81cc98dea9581 Mon Sep 17 00:00:00 2001 From: xyzroe Date: Sun, 9 Jun 2024 17:52:03 +0200 Subject: [PATCH 5/9] 20240609.1 - Revert to on task in workflow to avoid error while GitHub output command - Add detection of Zigbee role if none was previously selected. - Fix "no ETH" hardware boards hangs during boot. - Fix startup update check over WiFi (only when network is ready). - Fix small network errors in USB mode. - Enhance board configuration process: if multiple configurations are found, use the name Multi_X. - Add modal window on the root page to choose the device model when the board name is Multi_X. --- .github/workflows/build_fw.yml | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/.github/workflows/build_fw.yml b/.github/workflows/build_fw.yml index 940864c..3110f52 100644 --- a/.github/workflows/build_fw.yml +++ b/.github/workflows/build_fw.yml @@ -12,9 +12,6 @@ on: jobs: build_release_push: runs-on: ubuntu-latest - outputs: - tag: ${{ steps.get_tag.outputs.tag }} - commit_message: ${{ steps.get_commit_message.outputs.commit_message }} steps: - name: Clone repository uses: actions/checkout@v3 @@ -75,8 +72,6 @@ jobs: echo "commitMessage<> $GITHUB_ENV printf "%s\n" "$commitMessage" >> $GITHUB_ENV echo "EOF" >> $GITHUB_ENV - echo "${commitMessage}" > commit_message.txt - echo "commit_message=$(cat commit_message.txt)" >> $GITHUB_OUTPUT env: GITHUB_REF: ${{ github.ref }} @@ -130,18 +125,10 @@ jobs: cd releases git config --local user.email "action@github.com" git config --local user.name "GitHub Action" - if [[ -n $(git status --porcelain) ]]; then - git add . - git commit -m "Add firmware and manifest for version ${{ steps.get_tag.outputs.tag }}" - git push origin releases - else - echo "No changes to commit" - fi - - notify: - runs-on: ubuntu-latest - needs: build_release_push - steps: + git add . + git commit -m "Add firmware and manifest for version ${{ steps.get_tag.outputs.tag }}" + git push origin releases + - name: Send Telegram Notification about release uses: appleboy/telegram-action@master with: @@ -149,13 +136,13 @@ jobs: token: ${{ secrets.TELEGRAM_BOT_TOKEN }} format: markdown message: | - ${{ needs.build_release_push.outputs.commit_message }} + ${{ env.commitMessage }} - [${{ needs.build_release_push.outputs.tag }}](https://github.com/${{ github.repository }}/releases/tag/${{ needs.build_release_push.outputs.tag }}) + [${{ steps.get_tag.outputs.tag }}](https://github.com/${{ github.repository }}/releases/tag/${{ steps.get_tag.outputs.tag }}) - name: Send Discord Notification about release run: | - json_payload=$(jq -n --arg content "https://github.com/${{ github.repository }}/releases/tag/${{ needs.build_release_push.outputs.tag }}" '{content: $content}') + json_payload=$(jq -n --arg content "https://github.com/${{ github.repository }}/releases/tag/${{ steps.get_tag.outputs.tag }}" '{content: $content}') curl -H "Content-Type: application/json" \ -d "$json_payload" \ - ${{ secrets.DISCORD_WEBHOOK }} + ${{ secrets.DISCORD_WEBHOOK }} \ No newline at end of file From da947a1779d97bc913e79af0868b2138a9865f3b Mon Sep 17 00:00:00 2001 From: xyzroe Date: Sun, 9 Jun 2024 19:11:39 +0200 Subject: [PATCH 6/9] Fix commit and push to releases branch if no changes --- .github/workflows/build_fw.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_fw.yml b/.github/workflows/build_fw.yml index 3110f52..b2579aa 100644 --- a/.github/workflows/build_fw.yml +++ b/.github/workflows/build_fw.yml @@ -125,9 +125,13 @@ jobs: cd releases git config --local user.email "action@github.com" git config --local user.name "GitHub Action" - git add . - git commit -m "Add firmware and manifest for version ${{ steps.get_tag.outputs.tag }}" - git push origin releases + if [[ -n $(git status --porcelain) ]]; then + git add . + git commit -m "Add firmware and manifest for version ${{ steps.get_tag.outputs.tag }}" + git push origin releases + else + echo "No changes to commit" + fi - name: Send Telegram Notification about release uses: appleboy/telegram-action@master From 748bf625c7965afbd8b10e43715b813df0fd5dfb Mon Sep 17 00:00:00 2001 From: leroyloren <57643470+leroyloren@users.noreply.github.com> Date: Sun, 9 Jun 2024 19:20:55 +0200 Subject: [PATCH 7/9] Update cz.json --- src/websrc/json/cz.json | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/websrc/json/cz.json b/src/websrc/json/cz.json index b9a318d..6566473 100644 --- a/src/websrc/json/cz.json +++ b/src/websrc/json/cz.json @@ -106,7 +106,7 @@ } }, "u": { - "ai": "Automatická instalace aktualizací (ESP32 and Zigbee)", + "ai": "Automatická instalace aktualizací (ESP32 a Zigbee)", "d": { "ev": "Každý den", "fr": "Pátek", @@ -140,7 +140,7 @@ "ch": "Kanál", "nnf": "Sítě Wi-Fi nebyly nalezeny", "mode": "Režim", - "power": "Tx Power" + "power": "Tx výkon" } }, "zi": { @@ -190,7 +190,7 @@ "disc": { "n": "Home Assistant (MQTT zjišťování)", "ph": "Povolit nebo zakázat", - "tt": "💡 Povolte to pro funkci zjišťování MQTT Home Assistant" + "tt": "💡 Povolte to pro funkci zjišťování MQTT Home Assistantem" }, "user": { "ph": "Uživatelské jméno", @@ -203,7 +203,7 @@ "reconnect": { "n": "Opětovné připojení", "ph": "Interval opětovného připojení v sekundách", - "tt": "Zadejte rychlý pokus o opětovné připojení brokera (v sekundách)" + "tt": "Zadejte rychlý pokus o opětovné připojení serveru MQTT (v sekundách)" } }, "vp": { @@ -369,7 +369,7 @@ }, "fr": { "tt": "VAROVÁNÍ TOVÁRNÍ RESET", - "msg": "Tím se vymažou VŠECHNA nastavení." + "msg": "Tímto se vymažou VŠECHNA nastavení." }, "fu": { "tt": "AKTUALIZACE FIRMWARU XZG", @@ -392,6 +392,10 @@ "nip": "Nová IP adresa je {{ip}} Zařízení se nyní restartuje, aby se nové nastavení projevilo.", "btn": "Jít do", "err": "Chyba připojení, zkontrolujte SSID, HESLO a zkuste to znovu" + }, + "mc": { + "tt": "Vybrat model zařízení", + "mi": "Je podporováno více než jedno zařízení s přesně vaší konfigurací. Musíte si vybrat své zařízení." } }, "zb": { @@ -409,9 +413,9 @@ "nrf": "Chybí firmware routeru.", "ot": "Aktualizace Zigbee OTA", "rfm": "Získávání informací o firmwaru...", - "ntf": "Firmware Thread chybí.", + "ntf": "Thread firmware chybí.", "dtt": "OpenThread", - "cte": "Click to expand info" + "cte": "Kliknutím rozbalit informace" }, "ss": { "tt": "NASTAVENÍ ULOŽENO", From 0b122901b0de6870c50e07343da42a990928e3a1 Mon Sep 17 00:00:00 2001 From: leroyloren <57643470+leroyloren@users.noreply.github.com> Date: Sun, 9 Jun 2024 19:22:03 +0200 Subject: [PATCH 8/9] Update cz.json --- src/websrc/json/cz.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/websrc/json/cz.json b/src/websrc/json/cz.json index 6566473..0284b26 100644 --- a/src/websrc/json/cz.json +++ b/src/websrc/json/cz.json @@ -190,7 +190,7 @@ "disc": { "n": "Home Assistant (MQTT zjišťování)", "ph": "Povolit nebo zakázat", - "tt": "💡 Povolte to pro funkci zjišťování MQTT Home Assistantem" + "tt": "💡 Povolte to pro funkci zjišťování MQTT Home Assistentem" }, "user": { "ph": "Uživatelské jméno", From a757cbe9c4c2b136dcb064fa4cbe2cca623b15c3 Mon Sep 17 00:00:00 2001 From: xyzroe Date: Sun, 9 Jun 2024 19:22:11 +0200 Subject: [PATCH 9/9] Clean up the translations by removing unused entries and adding any missing ones. --- XZG.code-workspace | 7 +++++++ src/websrc/json/cz.json | 19 ++++++------------- src/websrc/json/de.json | 19 ++++++------------- src/websrc/json/en.json | 15 ++------------- src/websrc/json/es.json | 19 ++++++------------- src/websrc/json/fr.json | 19 ++++++------------- src/websrc/json/it.json | 19 ++++++------------- src/websrc/json/ja.json | 19 ++++++------------- src/websrc/json/pl.json | 19 ++++++------------- src/websrc/json/pt.json | 19 ++++++------------- src/websrc/json/ru.json | 19 ++++++------------- src/websrc/json/tr.json | 19 ++++++------------- src/websrc/json/uk.json | 19 ++++++------------- src/websrc/json/zh.json | 19 ++++++------------- 14 files changed, 81 insertions(+), 169 deletions(-) diff --git a/XZG.code-workspace b/XZG.code-workspace index 206e598..bf1e9dc 100644 --- a/XZG.code-workspace +++ b/XZG.code-workspace @@ -13,6 +13,13 @@ "files.associations": { "*.tpp": "cpp" }, + "i18n-ally.keysInUse": [ + "p.lo.mlo", + "p.lo.mwc", + "p.lo.mnl", + "p.mq.disc.ph", + "p.mq.disc.n" + ], }, "extensions": { "recommendations": [ diff --git a/src/websrc/json/cz.json b/src/websrc/json/cz.json index b9a318d..ef68f88 100644 --- a/src/websrc/json/cz.json +++ b/src/websrc/json/cz.json @@ -54,7 +54,6 @@ "sccn": "Žádné připojení", "sccy": "Ano, klienti: {{count}}", "su": "Doba připojení", - "tt": "Stav zařízení", "zfs": "Velikost flash", "zie": "IEEE" }, @@ -272,10 +271,7 @@ "efu": "Manuální flashování ESP32", "cf": "Vybrat soubor s firmwarem...", "ilfg": "Nainstalovat nejnovější", - "sri": "Vybrat verzi", "zu": "Aktualizace Zigbee (ve vývoji)", - "zfu": "Manuální flashování Zigbee", - "clzv": "Zkontrolovat nejnovější firmware Zigbee", "saf": "Zobrazit dostupné", "zgu": "Zigbee", "eznr": "Vymazat NVRAM" @@ -383,8 +379,7 @@ "vgds": "Stahování vydání {{ver}} z GitHubu...", "ucr": "Aktualizace dokončena! ", "prgs": "Aktualizace: {{per}}%", - "gvt": "Vydání na GitHubu", - "bil": "Instalovat nejnovější" + "gvt": "Vydání na GitHubu" }, "ws": { "tt": "Připojení k síti Wi-Fi", @@ -392,19 +387,17 @@ "nip": "Nová IP adresa je {{ip}} Zařízení se nyní restartuje, aby se nové nastavení projevilo.", "btn": "Jít do", "err": "Chyba připojení, zkontrolujte SSID, HESLO a zkuste to znovu" + }, + "mc": { + "mi": "More than one device with exactly your configuration is supported. You need to select your device.", + "tt": "Select your device model" } }, "zb": { - "fu": { - "vt": "ověřit: {{per}} %", - "vc": "Ověření dokončeno!" - }, + "fu": {}, "dtc": "Koordinátor", - "cfv": "Současný firmware: {{ver}}", "dtr": "Router", "efr": "Chyba při načítání informací o firmwaru
Zkontrolujte síť!", - "lcf": "Nejnovější firmware koordinátora:", - "lrf": "Nejnovější firmware routeru:", "ncf": "Chybí firmware koordinátora.", "nrf": "Chybí firmware routeru.", "ot": "Aktualizace Zigbee OTA", diff --git a/src/websrc/json/de.json b/src/websrc/json/de.json index 46d8434..253c31e 100644 --- a/src/websrc/json/de.json +++ b/src/websrc/json/de.json @@ -53,8 +53,7 @@ "ucr": "Aktualisierung abgeschlossen! \nNeustart!", "vgds": "Veröffentlichung {{ver}} wird von GitHub heruntergeladen...", "wdm": "Warten auf Gerät...", - "wm": "Dadurch werden ALLE Socket-Verbindungen getrennt", - "bil": "Neueste Version installieren" + "wm": "Dadurch werden ALLE Socket-Verbindungen getrennt" }, "rst": { "msg": "Warten auf Neustart. \nWird automatisch geschlossen.", @@ -67,19 +66,17 @@ "msg": "Verbindung zum Netzwerk wird gerade hergestellt... Warten Sie auf das Ergebnis.", "nip": "Die neue IP-Adresse lautet {{ip}}. Das Gerät wird jetzt neu gestartet, damit die neuen Einstellungen wirksam werden.", "tt": "Wi-Fi-Netzwerkverbindung" + }, + "mc": { + "mi": "Es werden mehr als ein Gerät mit genau Ihrer Konfiguration unterstützt. \nSie müssen Ihr Gerät auswählen.", + "tt": "Wählen Sie Ihr Gerätemodell aus" } }, "zb": { - "fu": { - "vc": "Überprüfung abgeschlossen!", - "vt": "überprüfen: {{per}} %" - }, - "cfv": "Ihre aktuelle Firmware-Version: {{ver}}", + "fu": {}, "dtc": "Koordinator", "dtr": "Router", "efr": "Fehler beim Abrufen der Firmware-Informationen
Überprüfen Sie Ihr Netzwerk!", - "lcf": "Neueste Koordinator-Firmware:", - "lrf": "Neueste Router-Firmware:", "ncf": "Keine Koordinator-Firmware verfügbar.", "nrf": "Keine Router-Firmware verfügbar.", "ot": "Zigbee OTA-Update", @@ -283,7 +280,6 @@ "mcl": "Client" }, "zbc": { - "tt": "Gerätestatus", "op": "Betriebsmodus", "opn": "Zigbee-Netzwerk", "opu": "Zigbee-USB", @@ -348,12 +344,9 @@ "sc": "Systemkontrolle", "usb": "USB", "zb": "Zigbee", - "zfu": "Aktualisierung der Zigbee-Datei", "zu": "Zigbee-Update (in Entwicklung)", "saf": "Verfügbare Firmwares anzeigen", - "clzv": "Überprüfen Sie die neuesten Zigbee-Firmwares", "zgu": "Git CC2652-Update", - "sri": "Version auswählen", "eznr": "NVRAM löschen" }, "vp": { diff --git a/src/websrc/json/en.json b/src/websrc/json/en.json index c3401e4..2b8663a 100644 --- a/src/websrc/json/en.json +++ b/src/websrc/json/en.json @@ -54,7 +54,6 @@ "sccn": "No connection", "sccy": "{{count}} clients", "su": "Connection time", - "tt": "Device status", "zfs": "Flash size", "zie": "IEEE" }, @@ -272,10 +271,7 @@ "efu": "ESP32 manual flashing", "cf": "Select firmware file...", "ilfg": "Install latest", - "sri": "Select version", "zu": "Zigbee update (in develop)", - "zfu": "Zigbee manual flashing", - "clzv": "Check the latest Zigbee firmware", "saf": "Show available...", "zgu": "Zigbee", "eznr": "Erase NVRAM" @@ -383,8 +379,7 @@ "vgds": "Downloading release {{ver}} from GitHub...", "ucr": "Update complete! Rebooting!", "prgs": "Update: {{per}}%", - "gvt": "GitHub releases", - "bil": "Install Latest" + "gvt": "GitHub releases" }, "ws": { "tt": "Wi-Fi network connection", @@ -399,16 +394,10 @@ } }, "zb": { - "fu": { - "vt": "validate: {{per}} %", - "vc": "Validate complete!" - }, + "fu": {}, "dtc": "Coordinator", - "cfv": "Current firmware: {{ver}}", "dtr": "Router", "efr": "Error while retrieving firmware information
Check the network!", - "lcf": "Latest coordinator firmware:", - "lrf": "Latest router firmware:", "ncf": "The coordinator firmware is missing.", "nrf": "The router firmware is missing.", "ot": "Zigbee OTA update", diff --git a/src/websrc/json/es.json b/src/websrc/json/es.json index ede58e7..5971a6b 100644 --- a/src/websrc/json/es.json +++ b/src/websrc/json/es.json @@ -53,8 +53,7 @@ "ucr": "¡Actualizacion completa! ¡Reiniciando!", "vgds": "Descargando la versión {{ver}} de GitHub...", "wdm": "Esperando al dispositivo...", - "wm": "Desconectará TODAS las conexiones del socket.", - "bil": "Instalar última versión" + "wm": "Desconectará TODAS las conexiones del socket." }, "rst": { "msg": "Esperando reinicio. Se cerrará automáticamente.", @@ -67,19 +66,17 @@ "msg": "Conectándose a la red en curso... Espere el resultado.", "nip": "La nueva dirección IP es {{ip}} El dispositivo ahora se reiniciará para que la nueva configuración surta efecto.", "tt": "Conexión de red Wifi" + }, + "mc": { + "mi": "Se admite más de un dispositivo con exactamente su configuración. \nDebes seleccionar tu dispositivo.", + "tt": "Selecciona tu modelo de dispositivo" } }, "zb": { - "fu": { - "vc": "¡Validación completa!", - "vt": "validación: {{per}} %" - }, - "cfv": "Su revisión de firmware actual: {{ver}}", + "fu": {}, "dtc": "Coordinador", "dtr": "Enrutador", "efr": "Error al obtener información del firmware
¡Comprueba tu red!", - "lcf": "Último firmware del coordinador:", - "lrf": "Último firmware del enrutador:", "ncf": "No hay firmware del coordinador disponible.", "nrf": "No hay firmware del enrutador disponible.", "ot": "Actualización Zigbee OTA", @@ -280,7 +277,6 @@ "mcl": "Cliente" }, "zbc": { - "tt": "Estado del dispositivo", "op": "Modo de operación", "opn": "Red Zigbee", "opu": "Zigbee-USB", @@ -345,12 +341,9 @@ "sc": "Control del sistema", "usb": "USB", "zb": "Zigbee", - "zfu": "Actualización de archivos Zigbee", "zu": "Actualización de Zigbee (en desarrollo)", "saf": "Mostrar firmwares disponibles", - "clzv": "Verifique los últimos firmwares de Zigbee", "zgu": "Actualización de Git CC2652", - "sri": "Seleccionar versión", "eznr": "Borrar NVRAM" }, "vp": { diff --git a/src/websrc/json/fr.json b/src/websrc/json/fr.json index 86519ed..0db85c9 100644 --- a/src/websrc/json/fr.json +++ b/src/websrc/json/fr.json @@ -53,8 +53,7 @@ "ucr": "Mise à jour terminée! \nRedémarrage !", "vgds": "Téléchargement de la version {{ver}} depuis GitHub...", "wdm": "En attente de l'appareil...", - "wm": "Cela déconnectera TOUTES les connexions de prise", - "bil": "Installer le dernier" + "wm": "Cela déconnectera TOUTES les connexions de prise" }, "rst": { "msg": "Attente de redémarrage. \nSe fermera automatiquement.", @@ -67,19 +66,17 @@ "msg": "Connexion au réseau en cours... Attendez le résultat.", "nip": "La nouvelle adresse IP est {{ip}}. L'appareil va maintenant redémarrer pour que les nouveaux paramètres prennent effet.", "tt": "Connexion réseau Wi-Fi" + }, + "mc": { + "mi": "Plusieurs appareils avec exactement votre configuration sont pris en charge. \nVous devez sélectionner votre appareil.", + "tt": "Sélectionnez le modèle de votre appareil" } }, "zb": { - "fu": { - "vc": "Validez terminé !", - "vt": "valider : {{per}} %" - }, - "cfv": "Votre révision actuelle du micrologiciel : {{ver}}", + "fu": {}, "dtc": "Coordinateur", "dtr": "Routeur", "efr": "Erreur lors de la récupération des informations sur le micrologiciel
Vérifiez votre réseau !", - "lcf": "Dernier firmware du coordinateur :", - "lrf": "Dernier firmware du routeur :", "ncf": "Aucun micrologiciel du coordinateur disponible.", "nrf": "Aucun firmware de routeur disponible.", "ot": "Mise à jour Zigbee OTA", @@ -283,7 +280,6 @@ "mcl": "Client" }, "zbc": { - "tt": "Statut du périphérique", "op": "Mode opérationnel", "opn": "Réseau Zigbee", "opu": "Zigbee-USB", @@ -348,12 +344,9 @@ "sc": "Controle du système", "usb": "USB", "zb": "Zigbee", - "zfu": "Mise à jour du fichier Zigbee", "zu": "Mise à jour Zigbee (en développement)", "saf": "Afficher les firmwares disponibles", - "clzv": "Vérifiez les derniers firmwares Zigbee", "zgu": "Mise à jour Git CC2652", - "sri": "Sélectionnez la version", "eznr": "Effacer la NVRAM" }, "vp": { diff --git a/src/websrc/json/it.json b/src/websrc/json/it.json index d390ea8..f048751 100644 --- a/src/websrc/json/it.json +++ b/src/websrc/json/it.json @@ -53,8 +53,7 @@ "ucr": "Aggiornamento completato! \nRiavvio!", "vgds": "Download della versione {{ver}} da GitHub in corso...", "wdm": "In attesa del dispositivo...", - "wm": "Disconnetterà TUTTE le connessioni socket", - "bil": "Installa l'ultima versione" + "wm": "Disconnetterà TUTTE le connessioni socket" }, "rst": { "msg": "In attesa di riavvio. \nSi chiuderà automaticamente.", @@ -67,19 +66,17 @@ "msg": "Connessione alla rete in corso... Attendi il risultato.", "nip": "Il nuovo indirizzo IP è {{ip}} Il dispositivo verrà ora riavviato affinché le nuove impostazioni abbiano effetto.", "tt": "Connessione di rete Wi-Fi" + }, + "mc": { + "mi": "È supportato più di un dispositivo con esattamente la tua configurazione. \nDevi selezionare il tuo dispositivo.", + "tt": "Seleziona il modello del tuo dispositivo" } }, "zb": { - "fu": { - "vc": "Convalida completa!", - "vt": "convalida: {{per}} %" - }, - "cfv": "La tua attuale revisione del firmware: {{ver}}", + "fu": {}, "dtc": "Coordinatore", "dtr": "Router", "efr": "Errore durante il recupero delle informazioni sul firmware
Controlla la tua rete!", - "lcf": "Ultimo firmware del coordinatore:", - "lrf": "Firmware più recente del router:", "ncf": "Nessun firmware del coordinatore disponibile.", "nrf": "Nessun firmware del router disponibile.", "ot": "Aggiornamento Zigbee OTA", @@ -283,7 +280,6 @@ "mcl": "Cliente" }, "zbc": { - "tt": "Stato del dispositivo", "op": "Modalità operativa", "opn": "Rete Zigbee", "opu": "Zigbee-USB", @@ -348,12 +344,9 @@ "sc": "Controllo del sistema", "usb": "USB", "zb": "Zigbee", - "zfu": "Aggiornamento del file Zigbee", "zu": "Aggiornamento Zigbee (in fase di sviluppo)", "saf": "Mostra i firmware disponibili", - "clzv": "Controlla gli ultimi firmware Zigbee", "zgu": "Aggiornamento Git CC2652", - "sri": "Seleziona la versione", "eznr": "Cancella NVRAM" }, "vp": { diff --git a/src/websrc/json/ja.json b/src/websrc/json/ja.json index 0cdfa2c..43f0c6c 100644 --- a/src/websrc/json/ja.json +++ b/src/websrc/json/ja.json @@ -53,8 +53,7 @@ "ucr": "アップデート完了!\n再起動中です!", "vgds": "GitHub からリリース {{ver}} をダウンロードしています...", "wdm": "デバイスを待っている...", - "wm": "すべてのソケット接続が切断されます", - "bil": "最新のインストール" + "wm": "すべてのソケット接続が切断されます" }, "rst": { "msg": "再起動を待っている。\n自動的に閉まります。", @@ -67,19 +66,17 @@ "msg": "ネットワークに接続中です...結果を待ちます。", "nip": "新しい IP アドレスは {{ip}} です。新しい設定を有効にするためにデバイスが再起動されます。", "tt": "Wi-Fiネットワーク接続" + }, + "mc": { + "mi": "正確に構成された複数のデバイスがサポートされています。\nデバイスを選択する必要があります。", + "tt": "デバイスのモデルを選択してください" } }, "zb": { - "fu": { - "vc": "検証完了!", - "vt": "検証: {{per}} %" - }, - "cfv": "現在のファームウェア リビジョン: {{ver}}", + "fu": {}, "dtc": "コーディネーター", "dtr": "ルーター", "efr": "ファームウェア情報の取得中にエラーが発生しました
ネットワークを確認してください。", - "lcf": "最新のコーディネーターファームウェア:", - "lrf": "最新のルーターファームウェア:", "ncf": "利用可能なコーディネーター ファームウェアがありません。", "nrf": "利用可能なルーターのファームウェアがありません。", "ot": "Zigbee OTA アップデート", @@ -283,7 +280,6 @@ "mcl": "クライアント" }, "zbc": { - "tt": "デバイスのステータス", "op": "動作モード", "opn": "Zigbee ネットワーク", "opu": "Zigbee-USB", @@ -348,12 +344,9 @@ "sc": "システム制御", "usb": "USB", "zb": "ジグビー", - "zfu": "Zigbeeファイルのアップデート", "zu": "Zigbee アップデート (開発中)", "saf": "利用可能なファームウェアを表示する", - "clzv": "最新の Zigbee ファームウェアを確認する", "zgu": "Git CC2652 アップデート", - "sri": "バージョンの選択", "eznr": "NVRAMの消去" }, "vp": { diff --git a/src/websrc/json/pl.json b/src/websrc/json/pl.json index 6529058..5fd1353 100644 --- a/src/websrc/json/pl.json +++ b/src/websrc/json/pl.json @@ -53,8 +53,7 @@ "ucr": "Aktualizacja zakończona! \nPonowne uruchamianie!", "vgds": "Pobieram wersję {{ver}} z GitHub...", "wdm": "Oczekiwanie na urządzenie...", - "wm": "Spowoduje to rozłączenie WSZYSTKICH połączeń gniazd", - "bil": "Zainstaluj najnowsze" + "wm": "Spowoduje to rozłączenie WSZYSTKICH połączeń gniazd" }, "rst": { "msg": "Czekając na ponowne uruchomienie. \nZamknie się automatycznie.", @@ -67,19 +66,17 @@ "msg": "Trwa łączenie z siecią... Poczekaj na wynik.", "nip": "Nowy adres IP to {{ip}}. Urządzenie uruchomi się teraz ponownie, aby nowe ustawienia zaczęły obowiązywać.", "tt": "Połączenie z siecią Wi-Fi" + }, + "mc": { + "mi": "Obsługiwane jest więcej niż jedno urządzenie o dokładnie takiej konfiguracji. \nMusisz wybrać swoje urządzenie.", + "tt": "Wybierz model swojego urządzenia" } }, "zb": { - "fu": { - "vc": "Weryfikacja zakończona!", - "vt": "zatwierdź: {{per}}%" - }, - "cfv": "Twoja aktualna wersja oprogramowania: {{ver}}", + "fu": {}, "dtc": "Koordynator", "dtr": "Routera", "efr": "Błąd podczas pobierania informacji o oprogramowaniu sprzętowym
Sprawdź swoją sieć!", - "lcf": "Najnowsze oprogramowanie koordynatora:", - "lrf": "Najnowsze oprogramowanie routera:", "ncf": "Brak dostępnego oprogramowania sprzętowego koordynatora.", "nrf": "Brak dostępnego oprogramowania sprzętowego routera.", "ot": "Aktualizacja Zigbee OTA", @@ -283,7 +280,6 @@ "mcl": "Klient" }, "zbc": { - "tt": "Status urządzenia", "op": "Tryb działania", "opn": "Sieć Zigbee", "opu": "Zigbee-USB", @@ -348,12 +344,9 @@ "sc": "Sterowanie systemem", "usb": "USB", "zb": "Zigbee", - "zfu": "Aktualizacja pliku Zigbee", "zu": "Aktualizacja Zigbee (w przygotowaniu)", "saf": "Pokaż dostępne oprogramowanie sprzętowe", - "clzv": "Sprawdź najnowsze oprogramowanie sprzętowe Zigbee", "zgu": "Aktualizacja Gita CC2652", - "sri": "Wybierz wersję", "eznr": "Wymaż NVRAM" }, "vp": { diff --git a/src/websrc/json/pt.json b/src/websrc/json/pt.json index 1c2948d..b9c4887 100644 --- a/src/websrc/json/pt.json +++ b/src/websrc/json/pt.json @@ -53,8 +53,7 @@ "ucr": "Atualização completa! \nReiniciando!", "vgds": "Baixando a versão {{ver}} do GitHub...", "wdm": "Aguardando dispositivo...", - "wm": "Isso desconectará TODAS as conexões de soquete", - "bil": "Instalar mais recente" + "wm": "Isso desconectará TODAS as conexões de soquete" }, "rst": { "msg": "Esperando a reinicialização. \nFechará automaticamente.", @@ -67,19 +66,17 @@ "msg": "Conectando-se à rede em andamento... Aguarde o resultado.", "nip": "O novo endereço IP é {{ip}} O dispositivo será reiniciado para que as novas configurações tenham efeito.", "tt": "Conexão de rede Wi-Fi" + }, + "mc": { + "mi": "Mais de um dispositivo com exatamente a sua configuração é suportado. \nVocê precisa selecionar seu dispositivo.", + "tt": "Selecione o modelo do seu dispositivo" } }, "zb": { - "fu": { - "vc": "Validação completa!", - "vt": "validar: {{por}}%" - }, - "cfv": "Sua revisão de firmware atual: {{ver}}", + "fu": {}, "dtc": "Coordenador", "dtr": "Roteador", "efr": "Erro ao buscar informações de firmware
Verifique sua rede!", - "lcf": "Firmware do coordenador mais recente:", - "lrf": "Firmware do roteador mais recente:", "ncf": "Nenhum firmware de coordenador disponível.", "nrf": "Nenhum firmware de roteador disponível.", "ot": "Atualização Zigbee OTA", @@ -283,7 +280,6 @@ "mcl": "Cliente" }, "zbc": { - "tt": "Status do dispositivo", "op": "Modo operacional", "opn": "Rede Zigbee", "opu": "Zigbee-USB", @@ -348,12 +344,9 @@ "sc": "Controle de sistema", "usb": "USB", "zb": "Zigbee", - "zfu": "Atualização de arquivo Zigbee", "zu": "Atualização Zigbee (em desenvolvimento)", "saf": "Mostrar firmwares disponíveis", - "clzv": "Verifique os firmwares Zigbee mais recentes", "zgu": "Atualização do Git CC2652", - "sri": "Selecione a versão", "eznr": "Apagar NVRAM" }, "vp": { diff --git a/src/websrc/json/ru.json b/src/websrc/json/ru.json index f5b033d..40cd17b 100644 --- a/src/websrc/json/ru.json +++ b/src/websrc/json/ru.json @@ -53,8 +53,7 @@ "ucr": "Обновление завершено! Перезагрузка!", "vgds": "Загрузка релиза {{ver}} с GitHub...", "wdm": "Ожидание устройства...", - "wm": "Это отключит ВСЕ соединения сокетов.", - "bil": "Установить последнюю версию" + "wm": "Это отключит ВСЕ соединения сокетов." }, "rst": { "msg": "Ожидание перезагрузки. Закроется автоматически.", @@ -67,19 +66,17 @@ "msg": "Выполняется подключение к сети... Дождитесь результата.", "nip": "Новый IP-адрес: {{ip}}. Устройство перезагрузится, чтобы новые настройки вступили в силу.", "tt": "Подключение к сети Wi-Fi" + }, + "mc": { + "mi": "Поддерживается более одного устройства именно с вашей конфигурацией. \nВам необходимо выбрать свое устройство.", + "tt": "Выберите модель вашего устройства" } }, "zb": { - "fu": { - "vc": "Проверка завершена!", - "vt": "проверка: {{per}} %" - }, - "cfv": "Текущая версия прошивки: {{ver}}", + "fu": {}, "dtc": "Координатор", "dtr": "Роутер", "efr": "Ошибка при получении информации о прошивке
Проверьте сеть!", - "lcf": "Последняя прошивка координатора:", - "lrf": "Последняя прошивка роутера:", "ncf": "Прошивка координатора отсутствует.", "nrf": "Прошивка роутера отсутствует.", "ot": "Обновление Zigbee по OTA", @@ -283,7 +280,6 @@ "mcl": "Клиент" }, "zbc": { - "tt": "Состояние устройства", "op": "Режим работы", "opn": "Zigbee-сеть", "opu": "Zigbee-USB", @@ -348,12 +344,9 @@ "sc": "Системный контроль", "usb": "USB", "zb": "Zigbee", - "zfu": "Обновление файла Zigbee", "zu": "Обновление Zigbee (в разработке)", "saf": "Показать доступную прошивку", - "clzv": "Проверить последнюю версию прошивки Zigbee", "zgu": "Обновление Git CC2652", - "sri": "Выберите версию", "eznr": "Стереть NVRAM" }, "vp": { diff --git a/src/websrc/json/tr.json b/src/websrc/json/tr.json index 63b9844..ab62138 100644 --- a/src/websrc/json/tr.json +++ b/src/websrc/json/tr.json @@ -53,8 +53,7 @@ "ucr": "Güncelleme tamamlandı! \nYeniden başlatılıyor!", "vgds": "GitHub'dan {{ver}} sürümü indiriliyor...", "wdm": "Cihaz için bekliyor...", - "wm": "TÜM soket bağlantılarını kesecek", - "bil": "En Son Sürümü Yükle" + "wm": "TÜM soket bağlantılarını kesecek" }, "rst": { "msg": "Yeniden başlatmak için bekliyor. \nOtomatik olarak kapanacaktır.", @@ -67,19 +66,17 @@ "msg": "Ağa bağlanma işlemi sürüyor... Sonucu bekleyin.", "nip": "Yeni IP adresi: {{ip}} Yeni ayarların etkili olması için cihaz şimdi yeniden başlatılacak.", "tt": "Wi-Fi ağ bağlantısı" + }, + "mc": { + "mi": "Tam olarak sizin yapılandırmanıza sahip birden fazla cihaz desteklenir. \nCihazınızı seçmeniz gerekiyor.", + "tt": "Cihazınızın modelini seçin" } }, "zb": { - "fu": { - "vc": "Doğrulama tamamlandı!", - "vt": "doğrulama: %{{per}}" - }, - "cfv": "Mevcut donanım yazılımı revizyonunuz: {{ver}}", + "fu": {}, "dtc": "Koordinatör", "dtr": "Yönlendirici", "efr": "Ürün yazılımı bilgileri alınırken hata oluştu
Ağınızı kontrol edin!", - "lcf": "En son koordinatör yazılımı:", - "lrf": "En son yönlendirici ürün yazılımı:", "ncf": "Koordinatör yazılımı mevcut değil.", "nrf": "Yönlendirici ürün yazılımı mevcut değil.", "ot": "Zigbee OTA güncellemesi", @@ -283,7 +280,6 @@ "mcl": "Müşteri" }, "zbc": { - "tt": "Cihaz durumu", "op": "Operasyonel mod", "opn": "Zigbee Ağı", "opu": "Zigbee-USB", @@ -348,12 +344,9 @@ "sc": "Sistem kontrolü", "usb": "USB", "zb": "Zigbee", - "zfu": "Zigbee dosya güncellemesi", "zu": "Zigbee güncellemesi (geliştirilme aşamasında)", "saf": "Mevcut ürün yazılımlarını göster", - "clzv": "En yeni Zigbee yazılımlarını kontrol edin", "zgu": "Git CC2652 güncellemesi", - "sri": "Sürümü seçin", "eznr": "NVRAM'ı sil" }, "vp": { diff --git a/src/websrc/json/uk.json b/src/websrc/json/uk.json index 6d972c8..038d95f 100644 --- a/src/websrc/json/uk.json +++ b/src/websrc/json/uk.json @@ -54,7 +54,6 @@ "sccn": "Немає з'єднання", "sccy": "Так, {{count}} клієнтів", "su": "Час підключення", - "tt": "Стан пристрою", "zfs": "Розмір флеш-пам'яті", "zie": "IEEE" }, @@ -271,10 +270,7 @@ "efu": "Оновити файл ESP32", "cf": "Вибрати файл...", "ilfg": "Встановити останню версію", - "sri": "Виберіть версію", "zu": "Оновлення Zigbee (у розробці)", - "zfu": "Оновлення файлу Zigbee", - "clzv": "Перевірити останню прошивку Zigbee", "saf": "Показати доступну прошивку", "zgu": "Оновлення Git CC2652", "ls": "запуск...", @@ -383,8 +379,7 @@ "vgds": "Завантаження релізу {{ver}} з GitHub...", "ucr": "Оновлення завершено! Перезавантаження!", "prgs": "Оновлення: {{per}}%", - "gvt": "Релізи GitHub", - "bil": "Встановити останню версію" + "gvt": "Релізи GitHub" }, "ws": { "tt": "Підключення до мережі Wi-Fi", @@ -392,19 +387,17 @@ "nip": "Нова IP-адреса – {{ip}}. Пристрій перезавантажиться, щоб нові налаштування набули чинності.", "btn": "Перейти до", "err": "Помилка з'єднання, перевірте SSID, ПАРОЛЬ і спробуйте ще раз" + }, + "mc": { + "mi": "Підтримується більше одного пристрою з точною конфігурацією. \nПотрібно вибрати свій пристрій.", + "tt": "Виберіть модель пристрою" } }, "zb": { - "fu": { - "vt": "перевірка: {{per}} %", - "vc": "Перевірка виконана!" - }, + "fu": {}, "dtc": "Координатор", - "cfv": "Поточна прошивка: {{ver}}", "dtr": "Роутер", "efr": "Помилка під час отримання інформації про прошивку
Перевірте мережу!", - "lcf": "Остання прошивка координатора:", - "lrf": "Остання прошивка роутера:", "ncf": "Прошивка координатора відсутня.", "nrf": "Прошивка роутера відсутня.", "ot": "Оновлення Zigbee через OTA", diff --git a/src/websrc/json/zh.json b/src/websrc/json/zh.json index c2f3a12..dc04a65 100644 --- a/src/websrc/json/zh.json +++ b/src/websrc/json/zh.json @@ -53,8 +53,7 @@ "ucr": "更新完成!\n重启!", "vgds": "正在从 GitHub 下载版本 {{ver}}...", "wdm": "正在等待设备...", - "wm": "它将断开所有接口连接", - "bil": "安装最新版本" + "wm": "它将断开所有接口连接" }, "rst": { "msg": "等待重启。\n会自动关闭。", @@ -67,19 +66,17 @@ "msg": "正在连接网络...等待结果。", "nip": "新的 IP 地址是 {{ip}} 设备现在将重新启动以使新设置生效。", "tt": "Wi-Fi 网络连接" + }, + "mc": { + "mi": "支持不止一台与您的配置完全相同的设备。\n您需要选择您的设备。", + "tt": "选择您的设备型号" } }, "zb": { - "fu": { - "vc": "验证完成!", - "vt": "验证:{{per}} %" - }, - "cfv": "您当前的固件版本:{{ver}}", + "fu": {}, "dtc": "协调员", "dtr": "路由器", "efr": "获取固件信息时出错
检查您的网络!", - "lcf": "最新协调器固件:", - "lrf": "最新路由器固件:", "ncf": "没有可用的协调器固件。", "nrf": "没有可用的路由器固件。", "ot": "Zigbee OTA 更新", @@ -283,7 +280,6 @@ "mcl": "客户" }, "zbc": { - "tt": "设备状态", "op": "运作模式", "opn": "Zigbee网络", "opu": "Zigbee-USB", @@ -348,12 +344,9 @@ "sc": "系统控制", "usb": "USB", "zb": "Zigbee", - "zfu": "Zigbee 文件更新", "zu": "Zigbee 更新(开发中)", "saf": "显示可用固件", - "clzv": "检查最新的 Zigbee 固件", "zgu": "更新CC2652固件", - "sri": "选择版本", "eznr": "擦除NVRAM" }, "vp": {