diff --git a/sonoff/language/de-DE.h b/sonoff/language/de-DE.h
index 92e456f96..acff5f96b 100644
--- a/sonoff/language/de-DE.h
+++ b/sonoff/language/de-DE.h
@@ -28,7 +28,7 @@
* Use online command StateText to translate ON, OFF, HOLD and TOGGLE.
* Use online command Prefix to translate cmnd, stat and tele.
*
- * Updated until v6.6.0.14
+ * Updated until v6.6.0.21
\*********************************************************************/
//#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
@@ -157,7 +157,7 @@
#define D_TO "zu"
#define D_TOGGLE "An/Aus"
#define D_TOPIC "topic"
-#define D_TOTAL_USAGE "Total Usage"
+#define D_TOTAL_USAGE "Gesamtverbrauch"
#define D_TRANSMIT "Übertragen"
#define D_TRUE "wahr"
#define D_TVOC "TVOC"
@@ -320,11 +320,11 @@
#define D_MAC_ADDRESS "MAC-Adresse"
#define D_MQTT_HOST "MQTT Host"
#define D_MQTT_PORT "MQTT Port"
-#define D_MQTT_CLIENT "MQTT client"
-#define D_MQTT_USER "MQTT-Benutzer"
-#define D_MQTT_TOPIC "MQTT topic"
-#define D_MQTT_GROUP_TOPIC "MQTT group topic"
-#define D_MQTT_FULL_TOPIC "MQTT full topic"
+#define D_MQTT_CLIENT "MQTT Client"
+#define D_MQTT_USER "MQTT Benutzer"
+#define D_MQTT_TOPIC "MQTT Topic"
+#define D_MQTT_GROUP_TOPIC "MQTT Group Topic"
+#define D_MQTT_FULL_TOPIC "MQTT Full Topic"
#define D_MDNS_DISCOVERY "mDNS-Ermittlung"
#define D_MDNS_ADVERTISE "mDNS-Bekanntmachung"
#define D_ESP_CHIP_ID "ESP Chip ID"
@@ -335,15 +335,15 @@
#define D_UPGRADE_BY_WEBSERVER "Update über Web-Server"
#define D_OTA_URL "OTA-URL"
#define D_START_UPGRADE "Update starten"
-#define D_UPGRADE_BY_FILE_UPLOAD "Update-Datei hochladen"
+#define D_UPGRADE_BY_FILE_UPLOAD "Update Datei hochladen"
#define D_UPLOAD_STARTED "Upload gestartet"
#define D_UPGRADE_STARTED "Update gestartet"
#define D_UPLOAD_DONE "Upload abgeschlossen"
-#define D_UPLOAD_ERR_1 "keine Datei ausgewählt"
-#define D_UPLOAD_ERR_2 "ungenügend Speicherplatz"
-#define D_UPLOAD_ERR_3 "magic byte ist nicht 0xE9"
-#define D_UPLOAD_ERR_4 "Flash-Größe des Programmes ist größer als der reale Flashspeicher"
-#define D_UPLOAD_ERR_5 "Upload-buffer-Vergleich weicht ab"
+#define D_UPLOAD_ERR_1 "Keine Datei ausgewählt"
+#define D_UPLOAD_ERR_2 "Ungenügend Speicherplatz"
+#define D_UPLOAD_ERR_3 "Magic Byte ist nicht 0xE9"
+#define D_UPLOAD_ERR_4 "Datei überschreitet vorhdn. Flashspeicher"
+#define D_UPLOAD_ERR_5 "Upload Buffer Vergleich weicht ab"
#define D_UPLOAD_ERR_6 "Upload fehlgeschlagen. Aktiviere logging 3"
#define D_UPLOAD_ERR_7 "Upload abgebrochen"
#define D_UPLOAD_ERR_8 "Datei ungültig"
@@ -641,7 +641,7 @@
#define D_UNIT_INCREMENTS "inc"
#define D_UNIT_KILOGRAM "kg"
#define D_UNIT_KILOMETER_PER_HOUR "km/h"
-#define D_UNIT_KILOOHM "kOhm"
+#define D_UNIT_KILOOHM "kΩ"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m3"
diff --git a/sonoff/language/nl-NL.h b/sonoff/language/nl-NL.h
index 4091f9928..0e81cebff 100644
--- a/sonoff/language/nl-NL.h
+++ b/sonoff/language/nl-NL.h
@@ -28,7 +28,7 @@
* Use online command StateText to translate ON, OFF, HOLD and TOGGLE.
* Use online command Prefix to translate cmnd, stat and tele.
*
- * Updated until v6.0.0a
+ * Updated until v6.7.0
\*********************************************************************/
//#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
@@ -93,7 +93,7 @@
#define D_FALLBACK_TOPIC "Fallback Topic"
#define D_FALSE "Onwaar"
#define D_FILE "Bestand"
-#define D_FLOW_RATE "Flow rate"
+#define D_FLOW_RATE "Debiet"
#define D_FREE_MEMORY "Vrij geheugen"
#define D_FREQUENCY "Frequentie"
#define D_GAS "Gas"
@@ -149,7 +149,7 @@
#define D_STOP "Stop"
#define D_SUBNET_MASK "Subnet Masker"
#define D_SUBSCRIBE_TO "Abonneer op"
-#define D_UNSUBSCRIBE_FROM "Unsubscribe from"
+#define D_UNSUBSCRIBE_FROM "Uitschrijven van"
#define D_SUCCESSFUL "Gelukt"
#define D_SUNRISE "Zonsopgang"
#define D_SUNSET "Zonsondergang"
@@ -157,7 +157,7 @@
#define D_TO "naar"
#define D_TOGGLE "Toggle" // Wissel, Tuimel
#define D_TOPIC "Topic" // Onderwerp
-#define D_TOTAL_USAGE "Total Usage"
+#define D_TOTAL_USAGE "Totaal verbruik"
#define D_TRANSMIT "Verzend"
#define D_TRUE "Waar"
#define D_TVOC "TVOC"
@@ -167,15 +167,15 @@
#define D_USER "Gebruiker"
#define D_UTC_TIME "UTC"
#define D_UV_INDEX "UV-index"
-#define D_UV_INDEX_1 "Low"
-#define D_UV_INDEX_2 "Mid"
-#define D_UV_INDEX_3 "High"
-#define D_UV_INDEX_4 "Danger"
-#define D_UV_INDEX_5 "BurnL1/2"
-#define D_UV_INDEX_6 "BurnL3"
-#define D_UV_INDEX_7 "OoR"
+#define D_UV_INDEX_1 "Laag"
+#define D_UV_INDEX_2 "Gemiddeld"
+#define D_UV_INDEX_3 "Hoog"
+#define D_UV_INDEX_4 "Intens"
+#define D_UV_INDEX_5 "Gevaarlijk"
+#define D_UV_INDEX_6 "Schadelijk"
+#define D_UV_INDEX_7 "Uitzonderlijk"
#define D_UV_LEVEL "UV niveau"
-#define D_UV_POWER "UV Power"
+#define D_UV_POWER "UV intensiteit"
#define D_VERSION "Versie"
#define D_VOLTAGE "Spanning"
#define D_WEIGHT "Gewicht"
@@ -227,7 +227,7 @@
#define D_WITH_IP_ADDRESS "met IP adres"
#define D_WEBSERVER_STOPPED "Webserver gestopt"
#define D_FILE_NOT_FOUND "Bestand niet gevonden"
-#define D_REDIRECTED "Redirected to captive portal"
+#define D_REDIRECTED "Omleiding naar captive portal"
#define D_WIFIMANAGER_SET_ACCESSPOINT_AND_STATION "Wifimanager start AccessPoint en hou Station"
#define D_WIFIMANAGER_SET_ACCESSPOINT "Wifimanager start AccessPoint"
#define D_TRYING_TO_CONNECT "Apparaat probeert te verbinden met netwerk"
@@ -284,7 +284,7 @@
#define D_LOGGING_PARAMETERS "Logging parameters"
#define D_SERIAL_LOG_LEVEL "Serieel log niveau"
-#define D_MQTT_LOG_LEVEL "Mqtt log level"
+#define D_MQTT_LOG_LEVEL "Mqtt log niveau"
#define D_WEB_LOG_LEVEL "Web log niveau"
#define D_SYS_LOG_LEVEL "Syslog niveau"
#define D_MORE_DEBUG "Meer debug"
@@ -444,17 +444,17 @@
#define D_ENERGY_TOTAL "Verbruik totaal"
// xdrv_27_shutter.ino
-#define D_OPEN "Open"
-#define D_CLOSE "Close"
-#define D_DOMOTICZ_SHUTTER "Shutter"
+#define D_OPEN "Openen"
+#define D_CLOSE "Sluiten"
+#define D_DOMOTICZ_SHUTTER "Rolluik"
// xdrv_28_pcf8574.ino
-#define D_CONFIGURE_PCF8574 "Configure PCF8574"
-#define D_PCF8574_PARAMETERS "PCF8574 parameters"
-#define D_INVERT_PORTS "Invert Ports"
-#define D_DEVICE "Device"
-#define D_DEVICE_INPUT "Input"
-#define D_DEVICE_OUTPUT "Output"
+#define D_CONFIGURE_PCF8574 "Configureer PCF8574"
+#define D_PCF8574_PARAMETERS "PCF8574 Parameters"
+#define D_INVERT_PORTS "Inverteer Poorten"
+#define D_DEVICE "Apparaat"
+#define D_DEVICE_INPUT "Ingang"
+#define D_DEVICE_OUTPUT "Uitgang"
// xsns_05_ds18b20.ino
#define D_SENSOR_BUSY "Sensor bezet"
@@ -641,12 +641,12 @@
#define D_UNIT_INCREMENTS "inc"
#define D_UNIT_KILOGRAM "kg"
#define D_UNIT_KILOMETER_PER_HOUR "km/h" // or "km/h"
-#define D_UNIT_KILOOHM "kOhm"
+#define D_UNIT_KILOOHM "kΩ"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
-#define D_UNIT_MICROGRAM_PER_CUBIC_METER "ug/m3"
-#define D_UNIT_MICROMETER "um"
-#define D_UNIT_MICROSECOND "us"
+#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m3"
+#define D_UNIT_MICROMETER "µm"
+#define D_UNIT_MICROSECOND "µs"
#define D_UNIT_MILLIAMPERE "mA"
#define D_UNIT_MILLIMETER "mm"
#define D_UNIT_MILLIMETER_MERCURY "mmHg"
@@ -691,37 +691,37 @@
#define D_LOG_WIFI "WIF: " // Wifi
//SDM220
-#define D_PHASE_ANGLE "Phase Angle"
-#define D_IMPORT_ACTIVE "Import Active"
-#define D_EXPORT_ACTIVE "Export Active"
-#define D_IMPORT_REACTIVE "Import Reactive"
-#define D_EXPORT_REACTIVE "Export Reactive"
-#define D_TOTAL_REACTIVE "Total Reactive"
+#define D_PHASE_ANGLE "Fase hoek"
+#define D_IMPORT_ACTIVE "Import werkelijk"
+#define D_EXPORT_ACTIVE "Export werkelijk"
+#define D_IMPORT_REACTIVE "Import blind"
+#define D_EXPORT_REACTIVE "Export blind"
+#define D_TOTAL_REACTIVE "Totaal blind"
#define D_UNIT_KWARH "kVArh"
#define D_UNIT_ANGLE "Deg"
//SOLAXX1
-#define D_PV1_VOLTAGE "PV1 Voltage"
-#define D_PV1_CURRENT "PV1 Current"
-#define D_PV1_POWER "PV1 Power"
-#define D_PV2_VOLTAGE "PV2 Voltage"
-#define D_PV2_CURRENT "PV2 Current"
-#define D_PV2_POWER "PV2 Power"
-#define D_SOLAR_POWER "Solar Power"
-#define D_INVERTER_POWER "Inverter Power"
+#define D_PV1_VOLTAGE "PV1 spanning"
+#define D_PV1_CURRENT "PV1 stroom"
+#define D_PV1_POWER "PV1 vermogen"
+#define D_PV2_VOLTAGE "PV2 spanning"
+#define D_PV2_CURRENT "PV2 stroom"
+#define D_PV2_POWER "PV2 vermogen"
+#define D_SOLAR_POWER "Zon vermogen"
+#define D_INVERTER_POWER "Omvormer vermogen"
#define D_STATUS "Status"
-#define D_WAITING "Waiting"
-#define D_CHECKING "Checking"
-#define D_WORKING "Working"
-#define D_FAILURE "Failure"
-#define D_SOLAX_ERROR_0 "No Error Code"
-#define D_SOLAX_ERROR_1 "Grid Lost Fault"
-#define D_SOLAX_ERROR_2 "Grid Voltage Fault"
-#define D_SOLAX_ERROR_3 "Grid Frequency Fault"
-#define D_SOLAX_ERROR_4 "Pv Voltage Fault"
-#define D_SOLAX_ERROR_5 "Isolation Fault"
-#define D_SOLAX_ERROR_6 "Over Temperature Fault"
-#define D_SOLAX_ERROR_7 "Fan Fault"
-#define D_SOLAX_ERROR_8 "Other Device Fault"
+#define D_WAITING "Wacht"
+#define D_CHECKING "Controle"
+#define D_WORKING "Actief"
+#define D_FAILURE "Fout"
+#define D_SOLAX_ERROR_0 "Geen"
+#define D_SOLAX_ERROR_1 "Netverbinding"
+#define D_SOLAX_ERROR_2 "Netspanning"
+#define D_SOLAX_ERROR_3 "Netfrequentie"
+#define D_SOLAX_ERROR_4 "Pv spanning"
+#define D_SOLAX_ERROR_5 "Isolatie"
+#define D_SOLAX_ERROR_6 "Overtemperatuur"
+#define D_SOLAX_ERROR_7 "Ventilator"
+#define D_SOLAX_ERROR_8 "Overige"
#endif // _LANGUAGE_NL_NL_H_
diff --git a/sonoff/language/pt-PT.h b/sonoff/language/pt-PT.h
index bfa234599..f060ec5d3 100644
--- a/sonoff/language/pt-PT.h
+++ b/sonoff/language/pt-PT.h
@@ -57,7 +57,7 @@
#define D_AS "como"
#define D_AUTO "AUTO"
#define D_BLINK "Piscar"
-#define D_BLINKOFF "Piscar desligado"
+#define D_BLINKOFF "Piscar Desligado"
#define D_BOOT_COUNT "Contagem de Inicialização"
#define D_BRIGHTLIGHT "Brilho"
#define D_BSSID "BSSId"
@@ -65,7 +65,7 @@
#define D_BY "por" // Write by me
#define D_BYTES "Bytes"
#define D_CELSIUS "Celsius"
-#define D_CHANNEL "Channel"
+#define D_CHANNEL "Canal"
#define D_CO2 "Dioxido de Carbono"
#define D_CODE "Código" // Button code
#define D_COLDLIGHT "Luz Fria"
@@ -78,7 +78,7 @@
#define D_DARKLIGHT "Luz Escura"
#define D_DEBUG "Depurar"
#define D_DISABLED "Disabilitado"
-#define D_DISTANCE "Distance"
+#define D_DISTANCE "Distância"
#define D_DNS_SERVER "Servidor DNS"
#define D_DONE "Concluído"
#define D_DST_TIME "DST"
@@ -93,9 +93,9 @@
#define D_FALLBACK_TOPIC "Tópico para retornar"
#define D_FALSE "Falso"
#define D_FILE "Ficheiro"
-#define D_FLOW_RATE "Flow rate"
+#define D_FLOW_RATE "Taxa de Fluxo"
#define D_FREE_MEMORY "Memoria Livre"
-#define D_FREQUENCY "Frequency"
+#define D_FREQUENCY "Frequência"
#define D_GAS "Gás"
#define D_GATEWAY "Gateway"
#define D_GROUP "Grupo"
@@ -106,7 +106,7 @@
#define D_IMMEDIATE "Immediato" // Button immediate
#define D_INDEX "Indíce"
#define D_INFO "Info"
-#define D_INFRARED "Infrared"
+#define D_INFRARED "Infravermelho"
#define D_INITIALIZED "Inicializado"
#define D_IP_ADDRESS "Endereço IP"
#define D_LIGHT "Luz"
@@ -125,39 +125,39 @@
#define D_PORT "Porta"
#define D_POWER_FACTOR "Factor de Potência"
#define D_POWERUSAGE "Potência"
-#define D_POWERUSAGE_ACTIVE "Active Power"
-#define D_POWERUSAGE_APPARENT "Apparent Power"
-#define D_POWERUSAGE_REACTIVE "Reactive Power"
+#define D_POWERUSAGE_ACTIVE "Potência Ativa"
+#define D_POWERUSAGE_APPARENT "Potência Aparente"
+#define D_POWERUSAGE_REACTIVE "Potência Reativa"
#define D_PRESSURE "Pressão"
#define D_PRESSUREATSEALEVEL "Pressão ao nível do Mar"
#define D_PROGRAM_FLASH_SIZE "Tamanho do Programa na Flash"
#define D_PROGRAM_SIZE "Tamanho do Programa"
#define D_PROJECT "Projeto"
-#define D_RAIN "Rain"
+#define D_RAIN "Chuva"
#define D_RECEIVED "Recebido"
#define D_RESTART "Reiniciar"
#define D_RESTARTING "A reiniciar"
#define D_RESTART_REASON "Razão do reinicio"
#define D_RESTORE "Restauro"
#define D_RETAINED "Manter"
-#define D_RULE "Rule"
-#define D_SAVE "Salvar"
+#define D_RULE "Regra"
+#define D_SAVE "Guardar"
#define D_SENSOR "Sensor"
#define D_SSID "SSId"
#define D_START "Início"
#define D_STD_TIME "STD"
#define D_STOP "Parar"
#define D_SUBNET_MASK "Mascara sub rede"
-#define D_SUBSCRIBE_TO "Subescrever para"
-#define D_UNSUBSCRIBE_FROM "Unsubscribe from"
+#define D_SUBSCRIBE_TO "Subscrever"
+#define D_UNSUBSCRIBE_FROM "Cancelar subscrição de"
#define D_SUCCESSFUL "Successo"
-#define D_SUNRISE "Sunrise"
-#define D_SUNSET "Sunset"
+#define D_SUNRISE "Nascer do Sol"
+#define D_SUNSET "Pôr do Sol"
#define D_TEMPERATURE "Temperatura"
#define D_TO "para"
#define D_TOGGLE "Pressionar"
#define D_TOPIC "Tópico"
-#define D_TOTAL_USAGE "Total Usage"
+#define D_TOTAL_USAGE "Uso total"
#define D_TRANSMIT "Transmitir"
#define D_TRUE "Verdadeiro"
#define D_TVOC "TVOC"
@@ -167,38 +167,38 @@
#define D_USER "Utilizador"
#define D_UTC_TIME "UTC"
#define D_UV_INDEX "Indíce UV"
-#define D_UV_INDEX_1 "Low"
-#define D_UV_INDEX_2 "Mid"
-#define D_UV_INDEX_3 "High"
-#define D_UV_INDEX_4 "Danger"
-#define D_UV_INDEX_5 "BurnL1/2"
-#define D_UV_INDEX_6 "BurnL3"
+#define D_UV_INDEX_1 "Baixo"
+#define D_UV_INDEX_2 "Médio"
+#define D_UV_INDEX_3 "Elevado"
+#define D_UV_INDEX_4 "Perigoso"
+#define D_UV_INDEX_5 "QueimaduraL1/2"
+#define D_UV_INDEX_6 "QueimaduraL3"
#define D_UV_INDEX_7 "OoR"
#define D_UV_LEVEL "Nível UV"
-#define D_UV_POWER "UV Power"
+#define D_UV_POWER "Poder UV"
#define D_VERSION "Versão"
#define D_VOLTAGE "Voltagem"
-#define D_WEIGHT "Weight"
+#define D_WEIGHT "Peso"
#define D_WARMLIGHT "Luz Quente"
-#define D_WEB_SERVER "servidor WEB"
+#define D_WEB_SERVER "Servidor WEB"
// sonoff.ino
#define D_WARNING_MINIMAL_VERSION "AVISO esta versão não supporta configurações persistentes"
#define D_LEVEL_10 "nível 1-0"
#define D_LEVEL_01 "nível 0-1"
-#define D_SERIAL_LOGGING_DISABLED "Registro em serie desabilitado"
+#define D_SERIAL_LOGGING_DISABLED "Registro de porta série desabilitado"
#define D_SYSLOG_LOGGING_REENABLED "Registro do Syslog reativado"
#define D_SET_BAUDRATE_TO "Ajuste da velocidade para"
#define D_RECEIVED_TOPIC "Topico Recebido"
-#define D_DATA_SIZE "Tamanho de dados"
+#define D_DATA_SIZE "Tamanho de Dados"
#define D_ANALOG_INPUT "Entrada Analógica"
// support.ino
#define D_OSWATCH "osWatch"
#define D_BLOCKED_LOOP "Loop Bloqueado"
-#define D_WPS_FAILED_WITH_STATUS "WPSconfig Falha de estado"
-#define D_ACTIVE_FOR_3_MINUTES "ativo por 3 minutes"
+#define D_WPS_FAILED_WITH_STATUS "WPSconfig FALHOU com estado"
+#define D_ACTIVE_FOR_3_MINUTES "ativo por 3 minutos"
#define D_FAILED_TO_START "Falha ao iníciar"
#define D_PATCH_ISSUE_2186 "Questão 2186"
#define D_CONNECTING_TO_AP "Ligando ao AP"
@@ -212,17 +212,17 @@
#define D_QUERY_DONE "Consulta finalizada. Serviço MQTT não encontrado"
#define D_MQTT_SERVICE_FOUND "Serviço MQTT encontrado em"
#define D_FOUND_AT "encontrado em"
-#define D_SYSLOG_HOST_NOT_FOUND "Syslog anfitrião não encontrado"
+#define D_SYSLOG_HOST_NOT_FOUND "Anfitrião Syslog não encontrado"
// settings.ino
#define D_SAVED_TO_FLASH_AT "Guardado na flash em"
#define D_LOADED_FROM_FLASH_AT "Lido da flash em"
#define D_USE_DEFAULTS "Usar predefinições"
-#define D_ERASED_SECTOR "Apagar setores"
+#define D_ERASED_SECTOR "Apagado setor"
// xdrv_02_webserver.ino
-#define D_NOSCRIPT "To use Tasmota, please enable JavaScript"
-#define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMO firmware
Atualizar Por favor"
+#define D_NOSCRIPT "Para utilizar o Tasmota, por favor ative o JavaScript"
+#define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Firmware MÍNIMO
Por favor atualize"
#define D_WEBSERVER_ACTIVE_ON "Servidor WEB ativo em"
#define D_WITH_IP_ADDRESS "com o endereço IP"
#define D_WEBSERVER_STOPPED "Servitor WEB parou"
@@ -235,20 +235,20 @@
#define D_RESTART_IN "Reinicia em"
#define D_SECONDS "segundos"
#define D_DEVICE_WILL_RESTART "O dispositivo irá reiniciar dentro de alguns segundos"
-#define D_BUTTON_TOGGLE "Pressionar"
+#define D_BUTTON_TOGGLE "Alternar"
#define D_CONFIGURATION "Configuração"
#define D_INFORMATION "Informação"
#define D_FIRMWARE_UPGRADE "Atualização de Firmware"
#define D_CONSOLE "Consola"
-#define D_CONFIRM_RESTART "Confirmar o reinicio"
+#define D_CONFIRM_RESTART "Confirmar o reinício"
#define D_CONFIGURE_MODULE "Configurar Módulo"
#define D_CONFIGURE_WIFI "Configurar WiFi"
#define D_CONFIGURE_MQTT "Configurar MQTT"
#define D_CONFIGURE_DOMOTICZ "Configurar Domoticz"
-#define D_CONFIGURE_LOGGING "Configurar Logging"
+#define D_CONFIGURE_LOGGING "Configurar registro"
#define D_CONFIGURE_OTHER "Configurar outras opções"
-#define D_CONFIRM_RESET_CONFIGURATION "Apagar configuração Confirmar"
+#define D_CONFIRM_RESET_CONFIGURATION "Confirme o reinício da configuração"
#define D_RESET_CONFIGURATION "Apagar configuração"
#define D_BACKUP_CONFIGURATION "Guardar configuração"
#define D_RESTORE_CONFIGURATION "Repor configuração"
@@ -256,102 +256,102 @@
#define D_MODULE_PARAMETERS "Parametros do Módulo"
#define D_MODULE_TYPE "Tipo de Módulo"
-#define D_PULLUP_ENABLE "No Button/Switch pull-up"
+#define D_PULLUP_ENABLE "Sem pull-up de Botão/Interruptor"
#define D_ADC "ADC"
#define D_GPIO "GPIO"
-#define D_SERIAL_IN "Serial Entrada"
-#define D_SERIAL_OUT "Serial Saída"
+#define D_SERIAL_IN "Entrada de porta série"
+#define D_SERIAL_OUT "Saída de porta série"
#define D_WIFI_PARAMETERS "Parametros Wifi"
-#define D_SCAN_FOR_WIFI_NETWORKS "Em busca de redes wifi"
-#define D_SCAN_DONE "Busca finalizada"
-#define D_NO_NETWORKS_FOUND "Sem redes"
-#define D_REFRESH_TO_SCAN_AGAIN "Nova busca"
-#define D_DUPLICATE_ACCESSPOINT "Ponto de Acesso duplicado"
+#define D_SCAN_FOR_WIFI_NETWORKS "Procurar redes Wifi"
+#define D_SCAN_DONE "Pesquisa terminada"
+#define D_NO_NETWORKS_FOUND "Sem redes encontradas"
+#define D_REFRESH_TO_SCAN_AGAIN "Atualize para realizar nova pesquisa"
+#define D_DUPLICATE_ACCESSPOINT "Duplicar ponto de Acesso"
#define D_SKIPPING_LOW_QUALITY "Ignorado devido a baixa qualidade do sinal"
#define D_RSSI "RSSI"
#define D_WEP "WEP"
#define D_WPA_PSK "WPA PSK"
#define D_WPA2_PSK "WPA2 PSK"
-#define D_AP1_SSID "AP1 SSId"
-#define D_AP1_PASSWORD "AP1 Palavra Chave"
-#define D_AP2_SSID "AP2 SSId"
-#define D_AP2_PASSWORD "AP2 Palavra Chave"
+#define D_AP1_SSID "SSId do AP1"
+#define D_AP1_PASSWORD "Palavra Chave do AP1"
+#define D_AP2_SSID "SSId do AP2"
+#define D_AP2_PASSWORD "Palavra Chave do AP2"
#define D_MQTT_PARAMETERS "Parametros MQTT"
#define D_CLIENT "Cliente"
#define D_FULL_TOPIC "Tópico completo"
-#define D_LOGGING_PARAMETERS "Parametros Logging"
-#define D_SERIAL_LOG_LEVEL "Nível de registro serial"
-#define D_MQTT_LOG_LEVEL "Mqtt log level"
+#define D_LOGGING_PARAMETERS "Parametros para registro"
+#define D_SERIAL_LOG_LEVEL "Nível de registro na porta série"
+#define D_MQTT_LOG_LEVEL "Nível de registro MQTT"
#define D_WEB_LOG_LEVEL "Nível de registro WEB"
-#define D_SYS_LOG_LEVEL "Nível de registro Syslog"
+#define D_SYS_LOG_LEVEL "Nível de registro do Syslog"
#define D_MORE_DEBUG "Depurar mais"
-#define D_SYSLOG_HOST "Syslog anfitrião"
+#define D_SYSLOG_HOST "Anfitrião Syslog"
#define D_SYSLOG_PORT "Porta Syslog"
-#define D_TELEMETRY_PERIOD "Periodo de Telemetria"
+#define D_TELEMETRY_PERIOD "Período de Telemetria"
#define D_OTHER_PARAMETERS "Outros parametros"
-#define D_TEMPLATE "Template"
-#define D_ACTIVATE "Activate"
-#define D_WEB_ADMIN_PASSWORD "Palavra Chave de WEB Admin"
+#define D_TEMPLATE "Modelo"
+#define D_ACTIVATE "Ativar"
+#define D_WEB_ADMIN_PASSWORD "Palavra Chave do Admin WEB"
#define D_MQTT_ENABLE "MQTT habilitado"
#define D_FRIENDLY_NAME "Nome amigável"
#define D_BELKIN_WEMO "Belkin WeMo"
#define D_HUE_BRIDGE "Hue Bridge"
#define D_SINGLE_DEVICE "dispositivo único"
-#define D_MULTI_DEVICE "multiplos dispositivos"
+#define D_MULTI_DEVICE "dispositivo múltiplo"
-#define D_CONFIGURE_TEMPLATE "Configure Template"
-#define D_TEMPLATE_PARAMETERS "Template parameters"
-#define D_TEMPLATE_NAME "Name"
-#define D_BASE_TYPE "Based on"
-#define D_TEMPLATE_FLAGS "Options"
+#define D_CONFIGURE_TEMPLATE "Configurar Modelo"
+#define D_TEMPLATE_PARAMETERS "Parametros do Modelo"
+#define D_TEMPLATE_NAME "Nome do Modelo"
+#define D_BASE_TYPE "Baseado em"
+#define D_TEMPLATE_FLAGS "Opções"
-#define D_SAVE_CONFIGURATION "Salvar configuração"
+#define D_SAVE_CONFIGURATION "Guardar configuração"
#define D_CONFIGURATION_SAVED "Configuração guardada"
-#define D_CONFIGURATION_RESET "Reinicialização da configuração"
+#define D_CONFIGURATION_RESET "Reinicializar a configuração"
#define D_PROGRAM_VERSION "Versão do Programa"
-#define D_BUILD_DATE_AND_TIME "Data e Hora da construção"
+#define D_BUILD_DATE_AND_TIME "Data e Hora de criação"
#define D_CORE_AND_SDK_VERSION "Versão Core/SDK"
-#define D_FLASH_WRITE_COUNT "contagem de gravação flash"
+#define D_FLASH_WRITE_COUNT "Contagem de gravação da flash"
#define D_MAC_ADDRESS "Endereço MAC"
-#define D_MQTT_HOST "MQTT Servidor"
-#define D_MQTT_PORT "MQTT Porta"
-#define D_MQTT_CLIENT "MQTT Cliente"
-#define D_MQTT_USER "MQTT Utilizador"
-#define D_MQTT_TOPIC "MQTT Tópico"
-#define D_MQTT_GROUP_TOPIC "MQTT Tópico Grupo"
-#define D_MQTT_FULL_TOPIC "MQTT Tópico Completo"
+#define D_MQTT_HOST "Servidor MQTT"
+#define D_MQTT_PORT "Porta MQTT"
+#define D_MQTT_CLIENT "Cliente MQTT"
+#define D_MQTT_USER "Utilizador MQTT"
+#define D_MQTT_TOPIC "Tópico MQTT"
+#define D_MQTT_GROUP_TOPIC "Tópico MQTT de Grupo"
+#define D_MQTT_FULL_TOPIC "Tópico MQTT Completo"
#define D_MDNS_DISCOVERY "Descobrir mDNS"
#define D_MDNS_ADVERTISE "Anunciar mDNS"
-#define D_ESP_CHIP_ID "ESP Chip Id"
-#define D_FLASH_CHIP_ID "Flash Chip Id"
-#define D_FLASH_CHIP_SIZE "Flash Size"
-#define D_FREE_PROGRAM_SPACE "Espaço Livre Programa"
+#define D_ESP_CHIP_ID "ID do chip ESP"
+#define D_FLASH_CHIP_ID "ID do chip da Flash"
+#define D_FLASH_CHIP_SIZE "Tamanho da Flash"
+#define D_FREE_PROGRAM_SPACE "Espaço de Programa Livre"
#define D_UPGRADE_BY_WEBSERVER "Atualizar pelo servidor WEB"
-#define D_OTA_URL "OTA Url"
+#define D_OTA_URL "Url OTA"
#define D_START_UPGRADE "Iniciar atualização"
-#define D_UPGRADE_BY_FILE_UPLOAD "Atualização por envio de ficheiro"
-#define D_UPLOAD_STARTED "Início do envio"
+#define D_UPGRADE_BY_FILE_UPLOAD "Atualizar por envio de ficheiro"
+#define D_UPLOAD_STARTED "Envio Iniciado"
#define D_UPGRADE_STARTED "Atualização Iniciada"
#define D_UPLOAD_DONE "Atualização Finalizada"
#define D_UPLOAD_ERR_1 "Nenhum ficheiro selecionado"
-#define D_UPLOAD_ERR_2 "Nao existe espaço disponível"
-#define D_UPLOAD_ERR_3 "Byte mágico não é 0xE9"
+#define D_UPLOAD_ERR_2 "Não existe espaço disponível"
+#define D_UPLOAD_ERR_3 "O Byte mágico não é 0xE9"
#define D_UPLOAD_ERR_4 "O tamanho do programa e maior do que o tamanho real da flash"
-#define D_UPLOAD_ERR_5 "Envio buffer miscompare"
-#define D_UPLOAD_ERR_6 "Falha no envio. Hablitar logging 3"
+#define D_UPLOAD_ERR_5 "Comparação incorreta do buffer de upload"
+#define D_UPLOAD_ERR_6 "Falha no envio. Habilitar registro 3"
#define D_UPLOAD_ERR_7 "Envio cancelado"
#define D_UPLOAD_ERR_8 "Ficheiro inválido"
#define D_UPLOAD_ERR_9 "Ficheiro demasiado grande"
-#define D_UPLOAD_ERR_10 "Failed to init RF chip"
-#define D_UPLOAD_ERR_11 "Failed to erase RF chip"
-#define D_UPLOAD_ERR_12 "Failed to write to RF chip"
-#define D_UPLOAD_ERR_13 "Failed to decode RF firmware"
+#define D_UPLOAD_ERR_10 "Falha ao iniciar o chip de RF"
+#define D_UPLOAD_ERR_11 "Falha ao apagar o chip de RF"
+#define D_UPLOAD_ERR_12 "Falha ao escrever no chip de RF"
+#define D_UPLOAD_ERR_13 "Falha ao descodificar o firmware RF"
#define D_UPLOAD_ERROR_CODE "Código de erro do envio"
#define D_ENTER_COMMAND "Inserir comando"
@@ -361,14 +361,14 @@
// xdrv_01_mqtt.ino
#define D_FINGERPRINT "Verifique a impressão digital TLS..."
#define D_TLS_CONNECT_FAILED_TO "TLS não conseguiu ligar"
-#define D_RETRY_IN "Tentativa em"
-#define D_VERIFIED "Verificado impressão digital "
+#define D_RETRY_IN "Nova tentativa em"
+#define D_VERIFIED "Verificado usando impressão digital"
#define D_INSECURE "Ligação insegura devido à impressão digital inválida"
#define D_CONNECT_FAILED_TO "A ligação falhou ao"
// xplg_wemohue.ino
#define D_MULTICAST_DISABLED "Multicast desabilitado"
-#define D_MULTICAST_REJOINED "Multicast (re)ingressou"
+#define D_MULTICAST_REJOINED "Multicast (re)ingressado"
#define D_MULTICAST_JOIN_FAILED "Multicast falha no reingresso"
#define D_FAILED_TO_SEND_RESPONSE "Falha no envio de reposta"
@@ -377,13 +377,13 @@
#define D_WEMO_EVENT_SERVICE "WeMo evento de serviço"
#define D_WEMO_META_SERVICE "WeMo serviço meta"
#define D_WEMO_SETUP "WeMo configuração"
-#define D_RESPONSE_SENT "Rsposta enviada"
+#define D_RESPONSE_SENT "Resposta enviada"
#define D_HUE "Hue"
-#define D_HUE_BRIDGE_SETUP "Hue setup"
-#define D_HUE_API_NOT_IMPLEMENTED "Hue API nao implementada"
-#define D_HUE_API "Hue API"
-#define D_HUE_POST_ARGS "Hue POST args"
+#define D_HUE_BRIDGE_SETUP "Configuração do Hue"
+#define D_HUE_API_NOT_IMPLEMENTED "API Hue nao implementada"
+#define D_HUE_API "API Hue"
+#define D_HUE_POST_ARGS "Argumentos de POST HUE"
#define D_3_RESPONSE_PACKETS_SENT "3 pacotes de resposta enviados"
// xdrv_07_domoticz.ino
@@ -402,71 +402,71 @@
#define D_DOMOTICZ_CURRENT "Corrente/PM10"
#define D_DOMOTICZ_AIRQUALITY "Qualidade do Ar"
#define D_DOMOTICZ_P1_SMART_METER "P1SmartMeter"
-#define D_DOMOTICZ_UPDATE_TIMER "Tempo de atualização"
+#define D_DOMOTICZ_UPDATE_TIMER "Temporizador de atualização"
// xdrv_09_timers.ino
-#define D_CONFIGURE_TIMER "Configure Timer"
-#define D_TIMER_PARAMETERS "Timer parameters"
-#define D_TIMER_ENABLE "Enable Timers"
-#define D_TIMER_ARM "Arm"
-#define D_TIMER_TIME "Time"
-#define D_TIMER_DAYS "Days"
-#define D_TIMER_REPEAT "Repeat"
-#define D_TIMER_OUTPUT "Output"
-#define D_TIMER_ACTION "Action"
+#define D_CONFIGURE_TIMER "Configurar temporizador"
+#define D_TIMER_PARAMETERS "Parâmetros do temporizador"
+#define D_TIMER_ENABLE "Habilitar Temporizadores"
+#define D_TIMER_ARM "Armar"
+#define D_TIMER_TIME "Tempo"
+#define D_TIMER_DAYS "Dias"
+#define D_TIMER_REPEAT "Repetir"
+#define D_TIMER_OUTPUT "Aaída"
+#define D_TIMER_ACTION "Açao"
// xdrv_10_knx.ino
-#define D_CONFIGURE_KNX "Configure KNX"
-#define D_KNX_PARAMETERS "KNX Parameters"
-#define D_KNX_GENERAL_CONFIG "General"
-#define D_KNX_PHYSICAL_ADDRESS "Physical Address"
-#define D_KNX_PHYSICAL_ADDRESS_NOTE "( Must be unique on the KNX network )"
-#define D_KNX_ENABLE "Enable KNX"
-#define D_KNX_GROUP_ADDRESS_TO_WRITE "Data to Send to Group Addresses"
-#define D_ADD "Add"
-#define D_DELETE "Delete"
-#define D_REPLY "Reply"
-#define D_KNX_GROUP_ADDRESS_TO_READ "Group Addresses to Receive Data from"
+#define D_CONFIGURE_KNX "Configurar KNX"
+#define D_KNX_PARAMETERS "Parâmetros KNX"
+#define D_KNX_GENERAL_CONFIG "Geral"
+#define D_KNX_PHYSICAL_ADDRESS "Endereço físico"
+#define D_KNX_PHYSICAL_ADDRESS_NOTE "( Deve ser exclusivo na rede KNX )"
+#define D_KNX_ENABLE "Habilitar KNX"
+#define D_KNX_GROUP_ADDRESS_TO_WRITE "Dados para enviar para Endereços de Grupo"
+#define D_ADD "Adicionar"
+#define D_DELETE "Remover"
+#define D_REPLY "Responder"
+#define D_KNX_GROUP_ADDRESS_TO_READ "Endereços de Grupo de onde receber dados"
#define D_LOG_KNX "KNX: "
-#define D_RECEIVED_FROM "Received from"
-#define D_KNX_COMMAND_WRITE "Write"
-#define D_KNX_COMMAND_READ "Read"
-#define D_KNX_COMMAND_OTHER "Other"
-#define D_SENT_TO "sent to"
-#define D_KNX_WARNING "The group address ( 0 / 0 / 0 ) is reserved and can not be used."
-#define D_KNX_ENHANCEMENT "Communication Enhancement"
+#define D_RECEIVED_FROM "Recebido de"
+#define D_KNX_COMMAND_WRITE "Escrever"
+#define D_KNX_COMMAND_READ "Ler"
+#define D_KNX_COMMAND_OTHER "Outro"
+#define D_SENT_TO "enviar para"
+#define D_KNX_WARNING "O Endereço de Grupo ( 0 / 0 / 0 ) está reservado e não pode ser usado."
+#define D_KNX_ENHANCEMENT "Melhoria de Comunicação"
#define D_KNX_TX_SLOT "KNX TX"
#define D_KNX_RX_SLOT "KNX RX"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Consumo energético de hoje"
#define D_ENERGY_YESTERDAY "Consumo energético de ontem"
-#define D_ENERGY_TOTAL "Consumo total de energial"
+#define D_ENERGY_TOTAL "Consumo energético total"
// xdrv_27_shutter.ino
-#define D_OPEN "Open"
-#define D_CLOSE "Close"
-#define D_DOMOTICZ_SHUTTER "Shutter"
+#define D_OPEN "Abrir"
+#define D_CLOSE "Fechar"
+#define D_DOMOTICZ_SHUTTER "Estore"
// xdrv_28_pcf8574.ino
-#define D_CONFIGURE_PCF8574 "Configure PCF8574"
-#define D_PCF8574_PARAMETERS "PCF8574 parameters"
-#define D_INVERT_PORTS "Invert Ports"
-#define D_DEVICE "Device"
-#define D_DEVICE_INPUT "Input"
-#define D_DEVICE_OUTPUT "Output"
+#define D_CONFIGURE_PCF8574 "Configurar PCF8574"
+#define D_PCF8574_PARAMETERS "Parâmetros PCF8574"
+#define D_INVERT_PORTS "Inverter Portas"
+#define D_DEVICE "Dispositivo"
+#define D_DEVICE_INPUT "Entrada"
+#define D_DEVICE_OUTPUT "Saída"
// xsns_05_ds18b20.ino
#define D_SENSOR_BUSY "Sensor ocupado"
-#define D_SENSOR_CRC_ERROR "Erro Sensor CRC"
-#define D_SENSORS_FOUND "Sensors encontrados"
+#define D_SENSOR_CRC_ERROR "Erro no CRC do sensor"
+#define D_SENSORS_FOUND "Sensores encontrados"
// xsns_06_dht.ino
#define D_TIMEOUT_WAITING_FOR "Fim do tempo de espera"
#define D_START_SIGNAL_LOW "Sinal de início baixo"
#define D_START_SIGNAL_HIGH "Sinal de início elevado"
-#define D_PULSE "pulse"
-#define D_CHECKSUM_FAILURE "Falha Checksum"
+#define D_PULSE "pulso"
+#define D_CHECKSUM_FAILURE "Falha na soma de verificação"
// xsns_07_sht1x.ino
#define D_SENSOR_DID_NOT_ACK_COMMAND "Sensor não aceitou o comando ACK"
@@ -486,27 +486,27 @@
#define D_GZ_AXIS "Gyro Z-Axis"
// xsns_34_hx711.ino
-#define D_HX_CAL_REMOVE "Remove weigth"
-#define D_HX_CAL_REFERENCE "Load reference weigth"
-#define D_HX_CAL_DONE "Calibrated"
-#define D_HX_CAL_FAIL "Calibration failed"
-#define D_RESET_HX711 "Reset Scale"
-#define D_CONFIGURE_HX711 "Configure Scale"
-#define D_HX711_PARAMETERS "Scale parameters"
-#define D_ITEM_WEIGHT "Item weight"
-#define D_REFERENCE_WEIGHT "Reference weigth"
-#define D_CALIBRATE "Calibrate"
-#define D_CALIBRATION "Calibration"
+#define D_HX_CAL_REMOVE "Remover peso"
+#define D_HX_CAL_REFERENCE "Carregar peso de referência"
+#define D_HX_CAL_DONE "Calibrado"
+#define D_HX_CAL_FAIL "Falha na calibração"
+#define D_RESET_HX711 "Reiniciar balança"
+#define D_CONFIGURE_HX711 "Configurar balança"
+#define D_HX711_PARAMETERS "Parâmetros da balança"
+#define D_ITEM_WEIGHT "Peso do item"
+#define D_REFERENCE_WEIGHT "Peso de referência"
+#define D_CALIBRATE "Calibrar"
+#define D_CALIBRATION "Calibração"
//xsns_35_tx20.ino
-#define D_TX20_WIND_DIRECTION "Wind Direction"
-#define D_TX20_WIND_SPEED "Wind Speed"
-#define D_TX20_WIND_SPEED_AVG "Wind Speed Avg"
-#define D_TX20_WIND_SPEED_MAX "Wind Speed Max"
+#define D_TX20_WIND_DIRECTION "Direção do vento
+#define D_TX20_WIND_SPEED "Velocidade do vento"
+#define D_TX20_WIND_SPEED_AVG "Velocidade média do vento"
+#define D_TX20_WIND_SPEED_MAX "Velocidade máxima do vento"
#define D_TX20_NORTH "N"
#define D_TX20_EAST "E"
#define D_TX20_SOUTH "S"
-#define D_TX20_WEST "W"
+#define D_TX20_WEST "O"
//xsns_43_hre.ino
#define D_LOG_HRE "HRE: "
@@ -544,7 +544,7 @@
#define D_SENSOR_SPI_MISO "SPI MISO"
#define D_SENSOR_SPI_MOSI "SPI MOSI"
#define D_SENSOR_SPI_CLK "SPI CLK"
-#define D_SENSOR_BACKLIGHT "Luz negra"
+#define D_SENSOR_BACKLIGHT "Luz fundo"
#define D_SENSOR_PMS5003 "PMS5003"
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
@@ -573,7 +573,7 @@
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
#define D_SENSOR_SSPI_CS "SSPI CS"
#define D_SENSOR_SSPI_DC "SSPI DC"
-#define D_SENSOR_RF_SENSOR "RF Sensor"
+#define D_SENSOR_RF_SENSOR "Sensor RF"
#define D_SENSOR_AZ_RX "AZ Rx"
#define D_SENSOR_AZ_TX "AZ Tx"
#define D_SENSOR_MAX31855_CS "MX31855 CS"
@@ -599,7 +599,7 @@
#define D_SENSOR_ARIRFSEL "ALux IrSel"
#define D_SENSOR_TXD "Serial Tx"
#define D_SENSOR_RXD "Serial Rx"
-#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
+#define D_SENSOR_ROTARY "Rotativo" // Suffix "1A"
#define D_SENSOR_HRE_CLOCK "HRE Clock"
#define D_SENSOR_HRE_DATA "HRE Data"
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
@@ -657,7 +657,7 @@
#define D_UNIT_PARTS_PER_MILLION "ppm"
#define D_UNIT_PRESSURE "hPa"
#define D_UNIT_SECOND "sec"
-#define D_UNIT_SECTORS "sectors"
+#define D_UNIT_SECTORS "setores"
#define D_UNIT_VA "VA"
#define D_UNIT_VAR "VAr"
#define D_UNIT_VOLT "V"
@@ -691,37 +691,37 @@
#define D_LOG_WIFI "WIF: " // Wifi
//SDM220
-#define D_PHASE_ANGLE "Phase Angle"
-#define D_IMPORT_ACTIVE "Import Active"
-#define D_EXPORT_ACTIVE "Export Active"
-#define D_IMPORT_REACTIVE "Import Reactive"
-#define D_EXPORT_REACTIVE "Export Reactive"
-#define D_TOTAL_REACTIVE "Total Reactive"
+#define D_PHASE_ANGLE "Ângulo de fase"
+#define D_IMPORT_ACTIVE "Ativo importado"
+#define D_EXPORT_ACTIVE "Ativo exportado"
+#define D_IMPORT_REACTIVE "Reativo importado"
+#define D_EXPORT_REACTIVE "Reativo exportado"
+#define D_TOTAL_REACTIVE "Reactivo total"
#define D_UNIT_KWARH "kVArh"
#define D_UNIT_ANGLE "Deg"
//SOLAXX1
-#define D_PV1_VOLTAGE "PV1 Voltage"
-#define D_PV1_CURRENT "PV1 Current"
-#define D_PV1_POWER "PV1 Power"
-#define D_PV2_VOLTAGE "PV2 Voltage"
-#define D_PV2_CURRENT "PV2 Current"
-#define D_PV2_POWER "PV2 Power"
-#define D_SOLAR_POWER "Solar Power"
-#define D_INVERTER_POWER "Inverter Power"
-#define D_STATUS "Status"
-#define D_WAITING "Waiting"
-#define D_CHECKING "Checking"
-#define D_WORKING "Working"
-#define D_FAILURE "Failure"
-#define D_SOLAX_ERROR_0 "No Error Code"
-#define D_SOLAX_ERROR_1 "Grid Lost Fault"
-#define D_SOLAX_ERROR_2 "Grid Voltage Fault"
-#define D_SOLAX_ERROR_3 "Grid Frequency Fault"
-#define D_SOLAX_ERROR_4 "Pv Voltage Fault"
-#define D_SOLAX_ERROR_5 "Isolation Fault"
-#define D_SOLAX_ERROR_6 "Over Temperature Fault"
-#define D_SOLAX_ERROR_7 "Fan Fault"
-#define D_SOLAX_ERROR_8 "Other Device Fault"
+#define D_PV1_VOLTAGE "Voltagem PV1"
+#define D_PV1_CURRENT "Corrente PV1"
+#define D_PV1_POWER "Potência PV1"
+#define D_PV2_VOLTAGE "Voltagem PV2"
+#define D_PV2_CURRENT "Corrente PV2"
+#define D_PV2_POWER "Potência PV2"
+#define D_SOLAR_POWER "Potência Solar"
+#define D_INVERTER_POWER "Potência do Inversor"
+#define D_STATUS "Estado"
+#define D_WAITING "Esperando"
+#define D_CHECKING "Verificando"
+#define D_WORKING "Trabalhando"
+#define D_FAILURE "Falha"
+#define D_SOLAX_ERROR_0 "Nenhum código de erro"
+#define D_SOLAX_ERROR_1 "Falha devido a perda de rede"
+#define D_SOLAX_ERROR_2 "Falha devido a perda de tensão"
+#define D_SOLAX_ERROR_3 "Falha devido a perda de frequência"
+#define D_SOLAX_ERROR_4 "Falha de tensão de Pv"
+#define D_SOLAX_ERROR_5 "Falha de isolamento"
+#define D_SOLAX_ERROR_6 "Falha de temperatura excessiva"
+#define D_SOLAX_ERROR_7 "Falha no ventilador"
+#define D_SOLAX_ERROR_8 "Outra falha no dispositivo"
#endif // _LANGUAGE_PT_PT_H_
diff --git a/sonoff/language/uk-UK.h b/sonoff/language/uk-UK.h
index 8030b1f2a..67999ef11 100644
--- a/sonoff/language/uk-UK.h
+++ b/sonoff/language/uk-UK.h
@@ -139,7 +139,7 @@
#define D_RESTARTING "Перезавантаження"
#define D_RESTART_REASON "Причина перезавантаження"
#define D_RESTORE "відновлення"
-#define D_RETAINED "нерозподілений"
+#define D_RETAINED "зберігати"
#define D_RULE "Правило"
#define D_SAVE "Зберегти"
#define D_SENSOR "Давач"
diff --git a/sonoff/sonoff.h b/sonoff/sonoff.h
index 9dd173167..62dce5e2f 100644
--- a/sonoff/sonoff.h
+++ b/sonoff/sonoff.h
@@ -270,7 +270,7 @@ enum XsnsFunctions {FUNC_SETTINGS_OVERRIDE, FUNC_PIN_STATE, FUNC_MODULE_INIT, FU
FUNC_SAVE_AT_MIDNIGHT, FUNC_SAVE_BEFORE_RESTART,
FUNC_PREP_BEFORE_TELEPERIOD, FUNC_AFTER_TELEPERIOD, FUNC_JSON_APPEND, FUNC_WEB_SENSOR, FUNC_COMMAND, FUNC_COMMAND_SENSOR, FUNC_COMMAND_DRIVER,
FUNC_MQTT_SUBSCRIBE, FUNC_MQTT_INIT, FUNC_MQTT_DATA,
- FUNC_SET_POWER, FUNC_SET_DEVICE_POWER, FUNC_SHOW_SENSOR,
+ FUNC_SET_POWER, FUNC_SET_DEVICE_POWER, FUNC_SHOW_SENSOR, FUNC_ANY_KEY,
FUNC_ENERGY_EVERY_SECOND, FUNC_ENERGY_RESET,
FUNC_RULES_PROCESS, FUNC_SERIAL, FUNC_FREE_MEM, FUNC_BUTTON_PRESSED,
FUNC_WEB_ADD_BUTTON, FUNC_WEB_ADD_MAIN_BUTTON, FUNC_WEB_ADD_HANDLER, FUNC_SET_CHANNELS, FUNC_SET_SCHEME};
diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino
index 18afb76c7..18a699350 100755
--- a/sonoff/sonoff.ino
+++ b/sonoff/sonoff.ino
@@ -537,9 +537,10 @@ bool SendKey(uint32_t key, uint32_t device, uint32_t state)
Response_P(PSTR("{\"%s%d\":{\"State\":%d}}"), (key) ? "Switch" : "Button", device, state);
result = XdrvRulesProcess();
}
-#ifdef USE_KNX
- KnxSendButtonPower(key, device, state);
-#endif // USE_KNX
+ int32_t payload_save = XdrvMailbox.payload;
+ XdrvMailbox.payload = key << 16 | state << 8 | device;
+ XdrvCall(FUNC_ANY_KEY);
+ XdrvMailbox.payload = payload_save;
return result;
}
diff --git a/sonoff/support_wifi.ino b/sonoff/support_wifi.ino
index a0f4bd3e5..bfbc3631f 100644
--- a/sonoff/support_wifi.ino
+++ b/sonoff/support_wifi.ino
@@ -323,12 +323,22 @@ bool WifiCheckIPv6(void)
}
return ipv6_global;
}
+
+bool WifiCheckIPAddrStatus(void) // Return false for 169.254.x.x or fe80::/64
+{
+ bool ip_global=false;
+
+ for (auto a : addrList) {
+ if(!a.isLocal()) ip_global=true;
+ }
+ return ip_global;
+}
#endif // LWIP_IPV6=1
void WifiCheckIp(void)
{
#if LWIP_IPV6
- if(WifiCheckIPv6()) {
+ if(WifiCheckIPAddrStatus()) {
Wifi.status = WL_CONNECTED;
#else
if ((WL_CONNECTED == WiFi.status()) && (static_cast(WiFi.localIP()) != 0)) {
@@ -456,7 +466,7 @@ void WifiCheck(uint8_t param)
WifiCheckIp();
}
#if LWIP_IPV6
- if (WifiCheckIPv6()) {
+ if (WifiCheckIPAddrStatus()) {
#else
if ((WL_CONNECTED == WiFi.status()) && (static_cast(WiFi.localIP()) != 0) && !Wifi.config_type) {
#endif // LWIP_IPV6=1
diff --git a/sonoff/xdrv_02_mqtt.ino b/sonoff/xdrv_02_mqtt.ino
index 50f66c8ce..22ecf5f58 100644
--- a/sonoff/xdrv_02_mqtt.ino
+++ b/sonoff/xdrv_02_mqtt.ino
@@ -346,7 +346,7 @@ void MqttPublishLogging(const char *mxtime)
void MqttPublishDirect(const char* topic, bool retained)
{
char sretained[CMDSZ];
- char slog_type[10];
+ char slog_type[20];
#ifdef USE_DEBUG_DRIVER
ShowFreeMem(PSTR("MqttPublishDirect"));
diff --git a/sonoff/xdrv_11_knx.ino b/sonoff/xdrv_11_knx.ino
index 6fa6231c0..a1b45800e 100644
--- a/sonoff/xdrv_11_knx.ino
+++ b/sonoff/xdrv_11_knx.ino
@@ -672,8 +672,13 @@ void KnxUpdatePowerState(uint8_t device, power_t state)
}
-void KnxSendButtonPower(uint8_t key, uint8_t device, uint8_t state)
+void KnxSendButtonPower(void)
{
+ if (!(Settings.flag.knx_enabled)) { return; }
+
+ uint32_t key = (XdrvMailbox.payload >> 16) & 0xFF;
+ uint32_t device = XdrvMailbox.payload & 0xFF;
+ uint32_t state = (XdrvMailbox.payload >> 8) & 0xFF;
// key 0 = button_topic
// key 1 = switch_topic
// state 0 = off
@@ -681,9 +686,6 @@ void KnxSendButtonPower(uint8_t key, uint8_t device, uint8_t state)
// state 2 = toggle
// state 3 = hold
// state 9 = clear retain flag
- if (!(Settings.flag.knx_enabled)) { return; }
-// if (key)
-// {
// Search all the registered GA that has that output (variable: device) as parameter
uint8_t i = KNX_GA_Search(device + 8);
@@ -1207,8 +1209,13 @@ bool Xdrv11(uint8_t function)
case FUNC_LOOP:
if (!global_state.wifi_down) { knx.loop(); } // Process knx events
break;
- case FUNC_PRE_INIT:
- KNX_INIT();
+ case FUNC_EVERY_50_MSECOND:
+ if (toggle_inhibit) {
+ toggle_inhibit--;
+ }
+ break;
+ case FUNC_ANY_KEY:
+ KnxSendButtonPower();
break;
#ifdef USE_WEBSERVER
#ifdef USE_KNX_WEB_MENU
@@ -1220,14 +1227,12 @@ bool Xdrv11(uint8_t function)
break;
#endif // USE_KNX_WEB_MENU
#endif // USE_WEBSERVER
- case FUNC_EVERY_50_MSECOND:
- if (toggle_inhibit) {
- toggle_inhibit--;
- }
- break;
case FUNC_COMMAND:
result = DecodeCommand(kKnxCommands, KnxCommand);
break;
+ case FUNC_PRE_INIT:
+ KNX_INIT();
+ break;
// case FUNC_SET_POWER:
// break;
}
diff --git a/sonoff/xdrv_12_home_assistant.ino b/sonoff/xdrv_12_home_assistant.ino
index d5a52a491..e27f4a4d7 100644
--- a/sonoff/xdrv_12_home_assistant.ino
+++ b/sonoff/xdrv_12_home_assistant.ino
@@ -28,17 +28,15 @@ const char HASS_DISCOVER_RELAY[] PROGMEM =
"\"val_tpl\":\"{{value_json.%s}}\"," // POWER2
"\"pl_off\":\"%s\"," // OFF
"\"pl_on\":\"%s\"," // ON
-// "\"optimistic\":\"false\"," // false is Hass default when state_topic is set
"\"avty_t\":\"%s\"," // tele/dualr2/LWT
"\"pl_avail\":\"" D_ONLINE "\"," // Online
"\"pl_not_avail\":\"" D_OFFLINE "\""; // Offline
const char HASS_DISCOVER_BUTTON_SWITCH[] PROGMEM =
"{\"name\":\"%s\"," // dualr2 1 BTN
- "\"stat_t\":\"%s\"," // cmnd/dualr2/POWER (implies "\"optimistic\":\"false\",")
-// "\"value_template\":\"{{value_json.%s}}\"," // POWER2
- "\"pl_on\":\"%s\"," // TOGGLE
-// "\"optimistic\":\"false\"," // false is Hass default when state_topic is set
+ "\"stat_t\":\"%s\"," // stat/RESULT/ (implies "\"optimistic\":\"false\",")
+ "\"value_template\":\"{{value_json.%s}}\"," // BUTTON1
+ "\"pl_on\":\"%s\"," // ON
"\"avty_t\":\"%s\"," // tele/dualr2/LWT
"\"pl_avail\":\"" D_ONLINE "\"," // Online
"\"pl_not_avail\":\"" D_OFFLINE "\""; // Offline
@@ -91,10 +89,6 @@ const char HASS_DISCOVER_SENSOR_TEMP[] PROGMEM =
"\"val_tpl\":\"{{value_json['%s'].Temperature}}\"," // "SI7021-14":{"Temperature":null,"Humidity":null} -> {{ value_json['SI7021-14'].Temperature }}
"\"dev_cla\":\"temperature\""; // temperature
-const char HASS_DISCOVER_DS18X20_MULTI[] PROGMEM =
- ",\"json_attributes_topic\":\"%s\","
- "\"json_attributes_template\":\"{{{'Id':value_json['%s'].Id}|tojson}}\""; // Add DS18X20 Id as information field
-
const char HASS_DISCOVER_SENSOR_HUM[] PROGMEM =
",\"unit_of_meas\":\"%%\"," // %
"\"val_tpl\":\"{{value_json['%s'].Humidity}}\"," // "SI7021-14":{"Temperature":null,"Humidity":null} -> {{ value_json['SI7021-14'].Humidity }}
@@ -115,10 +109,12 @@ const char HASS_DISCOVER_SENSOR_WATT[] PROGMEM =
",\"unit_of_meas\":\"W\"," // W
"\"val_tpl\":\"{{value_json['%s'].%s}}\"," // "ENERGY":{"TotalStartTime":null,"Total":null,"Yesterday":null,"Today":null,"Power":null,"ApparentPower":null,"ReactivePower":null,"Factor":null,"Voltage":null,"Current":null} -> {{ value_json['ENERGY'].POWER }}
"\"dev_cla\":\"power\"";
+
const char HASS_DISCOVER_SENSOR_VOLTAGE[] PROGMEM =
",\"unit_of_meas\":\"V\"," // V
"\"val_tpl\":\"{{value_json['%s'].%s}}\"," // "ENERGY":{"TotalStartTime":null,"Total":null,"Yesterday":null,"Today":null,"Power":null,"ApparentPower":null,"ReactivePower":null,"Factor":null,"Voltage":null,"Current":null} -> {{ value_json['ENERGY'].Voltage }}
"\"dev_cla\":\"power\"";
+
const char HASS_DISCOVER_SENSOR_AMPERE[] PROGMEM =
",\"unit_of_meas\":\"A\"," // A
"\"val_tpl\":\"{{value_json['%s'].%s}}\"," // "ENERGY":{"TotalStartTime":null,"Total":null,"Yesterday":null,"Today":null,"Power":null,"ApparentPower":null,"ReactivePower":null,"Factor":null,"Voltage":null,"Current":null} -> {{ value_json['ENERGY'].Current }}
@@ -127,7 +123,7 @@ const char HASS_DISCOVER_SENSOR_AMPERE[] PROGMEM =
//ILLUMINANCE
const char HASS_DISCOVER_SENSOR_ILLUMINANCE[] PROGMEM =
",\"unit_of_meas\":\"LX\"," // LX by default
- "\"val_tpl\":\"{{value_json['%s'].Illuminance}}\"," // "ANALOG":{"Illuminance":34}}
+ "\"val_tpl\":\"{{value_json['%s'].Illuminance}}\"," // "ANALOG":{"Illuminance":34}}
"\"dev_cla\":\"illuminance\""; // illuminance
const char HASS_DISCOVER_SENSOR_ANY[] PROGMEM =
@@ -135,8 +131,9 @@ const char HASS_DISCOVER_SENSOR_ANY[] PROGMEM =
const char HASS_DISCOVER_SENSOR_HASS_STATUS[] PROGMEM =
",\"json_attributes_topic\":\"%s\","
- "\"unit_of_meas\":\" \"," // " " As unit of measurement to get a value graph in Hass
- "\"val_tpl\":\"{{value_json['" D_JSON_RSSI "']}}\""; // "COUNTER":{"C1":0} -> {{ value_json['COUNTER'].C1 }}
+ "\"unit_of_meas\":\" \"," // " " As unit of measurement to get a value graph in Hass
+ "\"val_tpl\":\"{{value_json['" D_JSON_RSSI "']}}\"," // "COUNTER":{"C1":0} -> {{ value_json['COUNTER'].C1 }}
+ "\"ic\":\"mdi:information-outline\"";
const char HASS_DISCOVER_DEVICE_INFO[] PROGMEM =
",\"uniq_id\":\"%s\","
@@ -319,20 +316,20 @@ void HAssAnnounceButtonSwitch(uint8_t device, char* topic, uint8_t present, uint
char prefix[TOPSZ];
char *state_topic = stemp1;
char *availability_topic = stemp2;
+ char jsoname[8];
- if (device+1 > MAX_FRIENDLYNAMES) {
- snprintf_P(name, sizeof(name), PSTR("%s %s %d"), Settings.friendlyname[0], key?"SW":"BTN", device+1);
- } else {
- snprintf_P(name, sizeof(name), PSTR("%s %s"), Settings.friendlyname[device], key?"SW":"BTN");
- }
+ snprintf_P(name, sizeof(name), PSTR("%s %s%d"), Settings.friendlyname[0], key?"Switch":"Button", device+1);
GetPowerDevice(value_template, device+1, sizeof(value_template),
key + Settings.flag.device_index_enable); // Force index for Switch 1, Index on Button1 is controlled by Settings.flag.device_index_enable
- GetTopic_P(state_topic, CMND, topic, value_template); // State of button is sent as CMND TOGGLE, state of switch is sent as ON/OFF
+ //GetTopic_P(state_topic, CMND, topic, value_template); // State of button is sent as CMND TOGGLE, state of switch is sent as ON/OFF
+ GetTopic_P(state_topic, STAT, mqtt_topic, PSTR(D_RSLT_RESULT));
GetTopic_P(availability_topic, TELE, mqtt_topic, S_LWT);
FindPrefix(state_topic, availability_topic, prefix);
+
Shorten(&state_topic, prefix);
Shorten(&availability_topic, prefix);
- Response_P(HASS_DISCOVER_BUTTON_SWITCH, name, state_topic, Settings.state_text[toggle?2:1], availability_topic);
+ snprintf_P(jsoname, sizeof(jsoname), PSTR("%s%d"), key?"SWITCH":"BUTTON", device+1);
+ Response_P(HASS_DISCOVER_BUTTON_SWITCH, name, state_topic, jsoname, Settings.state_text[toggle?2:1], availability_topic);
TryResponseAppend_P(HASS_DISCOVER_DEVICE_INFO_SHORT, unique_id, ESP.getChipId(), WiFi.macAddress().c_str());
if (strlen(prefix) > 0 ) TryResponseAppend_P(HASS_DISCOVER_TOPIC_PREFIX, prefix);
if (toggle) TryResponseAppend_P(HASS_DISCOVER_BUTTON_SWITCH_TOGGLE);
@@ -350,7 +347,7 @@ void HAssAnnounceSwitches(void)
// Send info about buttons
char *tmp = Settings.switch_topic;
Format(sw_topic, tmp, sizeof(sw_topic));
- if ((strlen(sw_topic) != 0) && strcmp(sw_topic, "0")) {
+ if (!strcmp_P(sw_topic, "0") || strlen(sw_topic) == 0 ) {
for (uint32_t switch_index = 0; switch_index < MAX_SWITCHES; switch_index++) {
uint8_t switch_present = 0;
uint8_t toggle = 1;
@@ -379,7 +376,7 @@ void HAssAnnounceButtons(void)
// Send info about buttons
char *tmp = Settings.button_topic;
Format(key_topic, tmp, sizeof(key_topic));
- if ((strlen(key_topic) != 0) && strcmp(key_topic, "0")) {
+ if (!strcmp_P(key_topic, "0") || strlen(key_topic) == 0 ) {
for (uint32_t button_index = 0; button_index < MAX_KEYS; button_index++) {
uint8_t button_present = 0;
uint8_t toggle = 1;
@@ -404,13 +401,13 @@ void HAssAnnounceButtons(void)
}
}
-void HAssAnnounceSensor(const char* sensorname, const char* subsensortype)
+void HAssAnnounceSensor(const char* sensorname, const char* subsensortype)
{
char stopic[TOPSZ];
char stemp1[TOPSZ];
char stemp2[TOPSZ];
char unique_id[30];
- bool is_sensor = true;
+ bool is_sensor = true;
// Announce sensor, special handling of temperature and humidity sensors
mqtt_data[0] = '\0'; // Clear retained message
@@ -466,10 +463,10 @@ void HAssAnnounceSensor(const char* sensorname, const char* subsensortype)
} else if (!strcmp_P(subsensortype, PSTR(D_JSON_ILLUMINANCE))){
TryResponseAppend_P(HASS_DISCOVER_SENSOR_ILLUMINANCE, sensorname, subsensortype);
} else {
- if (is_sensor){
- TryResponseAppend_P(PSTR(",\"unit_of_meas\":\" \"")); // " " As unit of measurement to get a value graph (not available for binary sensors)
- }
- TryResponseAppend_P(HASS_DISCOVER_SENSOR_ANY, sensorname, subsensortype);
+ if (is_sensor){
+ TryResponseAppend_P(PSTR(",\"unit_of_meas\":\" \"")); // " " As unit of measurement to get a value graph (not available for binary sensors)
+ }
+ TryResponseAppend_P(HASS_DISCOVER_SENSOR_ANY, sensorname, subsensortype);
}
TryResponseAppend_P(PSTR("}"));
}
@@ -611,6 +608,22 @@ void HAssDiscover(void)
hass_init_step = 1; // Delayed discovery
}
+void HAssAnyKey(void)
+{
+ if (!Settings.flag.hass_discovery) { return; }
+
+ uint32_t key = (XdrvMailbox.payload >> 16) & 0xFF;
+ uint32_t device = XdrvMailbox.payload & 0xFF;
+ uint32_t state = (XdrvMailbox.payload >> 8) & 0xFF;
+
+ char scommand[CMDSZ];
+ snprintf_P(scommand, sizeof(scommand), PSTR("%s%d"), (key) ? "SWITCH" : "BUTTON", device);
+ char stopic[TOPSZ];
+ GetTopic_P(stopic, STAT, mqtt_topic, (Settings.flag.mqtt_response) ? scommand : S_RSLT_RESULT);
+ Response_P(S_JSON_COMMAND_SVALUE, scommand, GetStateText(state));
+ MqttPublish(stopic);
+}
+
/*********************************************************************************************\
* Interface
\*********************************************************************************************/
@@ -621,10 +634,6 @@ bool Xdrv12(uint8_t function)
if (Settings.flag.mqtt_enabled) {
switch (function) {
- case FUNC_MQTT_INIT:
- hass_mode = 0; // Discovery only if Settings.flag.hass_discovery is set
- hass_init_step = 2; // Delayed discovery
- break;
case FUNC_EVERY_SECOND:
if (hass_init_step) {
hass_init_step--;
@@ -641,6 +650,13 @@ bool Xdrv12(uint8_t function)
}
}
break;
+ case FUNC_ANY_KEY:
+ HAssAnyKey();
+ break;
+ case FUNC_MQTT_INIT:
+ hass_mode = 0; // Discovery only if Settings.flag.hass_discovery is set
+ hass_init_step = 2; // Delayed discovery
+ break;
}
}
return result;
diff --git a/sonoff/xdrv_16_tuyamcu.ino b/sonoff/xdrv_16_tuyamcu.ino
index 797cdba8f..2cf63c8d0 100644
--- a/sonoff/xdrv_16_tuyamcu.ino
+++ b/sonoff/xdrv_16_tuyamcu.ino
@@ -276,8 +276,11 @@ bool TuyaSetPower(void)
uint8_t rpower = XdrvMailbox.index;
int16_t source = XdrvMailbox.payload;
+ uint8_t dpid = TuyaGetDpId(TUYA_MCU_FUNC_REL1 + active_device - 1);
+ if (dpid == 0) dpid = TuyaGetDpId(TUYA_MCU_FUNC_REL1_INV + active_device - 1);
+
if (source != SRC_SWITCH && TuyaSerial) { // ignore to prevent loop from pushing state from faceplate interaction
- TuyaSendBool(active_device, bitRead(rpower, active_device-1) ^ bitRead(rel_inverted, active_device-1));
+ TuyaSendBool(dpid, bitRead(rpower, active_device-1) ^ bitRead(rel_inverted, active_device-1));
status = true;
}
return status;