Merge branch 'development' into pre-release

This commit is contained in:
Theo Arends 2020-04-07 17:26:01 +02:00
commit c7aeadcd6b
30 changed files with 97 additions and 28 deletions

View File

@ -64,7 +64,9 @@ The following binary downloads have been compiled with ESP8266/Arduino library c
- Add Zigbee command ``ZbUnbind``
- Add Zigbee command ``ZbBindState`` and ``manuf``attribute
- Add commands ``CounterDebounceLow`` and ``CounterDebounceHigh`` to control debouncing (#8021)
- Add command ``SetOption41 <x>`` to force sending gratuitous ARP every <x> seconds
- Add command ``SetOption90 1`` to disable non-json MQTT messages (#8044)
- Add command ``SetOption91 1`` to enable fading at startup / power on
- Add command ``Sensor10 0/1/2`` to control BH1750 resolution - 0 = High (default), 1 = High2, 2 = Low (#8016)
- Add command ``Sensor10 31..254`` to control BH1750 measurement time which defaults to 69 (#8016)
- Add support for unreachable (unplugged) Zigbee devices in Philips Hue emulation and Alexa
@ -72,3 +74,4 @@ The following binary downloads have been compiled with ESP8266/Arduino library c
- Add support for up to four MQTT GroupTopics using the same optional Device Group names (#8014)
- Add console command history (#7483, #8015)
- Add support for longer template names
- Add quick wifi reconnect using saved AP parameters when ``SetOption56 0`` (#3189)

View File

@ -18,6 +18,8 @@
- Add command ``Sensor10 0/1/2`` to control BH1750 resolution - 0 = High (default), 1 = High2, 2 = Low (#8016)
- Add command ``Sensor10 31..254`` to control BH1750 measurement time which defaults to 69 (#8016)
- Add command ``SetOption91 1`` to enable fading at startup / power on
- Add command ``SetOption41 <x>`` to force sending gratuitous ARP every <x> seconds
- Add quick wifi reconnect using saved AP parameters when ``SetOption56 0`` (#3189)
### 8.2.0.2 20200328

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "в режим"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "Грешка при свързването, не е получен IP адрес"
#define D_CONNECT_FAILED_AP_NOT_REACHED "Грешка при свързването, точката за достъп е недостижима"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Грешка при свързването, грешна парола към точката за достъп"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Грешка при свързването"
#define D_CONNECT_FAILED_AP_TIMEOUT "Грешка при свързването, превишено време за изчакване"
#define D_ATTEMPTING_CONNECTION "Опитва свързване..."
#define D_CHECKING_CONNECTION "Проверка на свързването..."

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "v módu"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "Chyba připojení, nebyla obdržena IP adresa"
#define D_CONNECT_FAILED_AP_NOT_REACHED "Chyba připojení, nedostupný AP"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Chyba připojení, nesprávné heslo pro AP"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Chyba připojení"
#define D_CONNECT_FAILED_AP_TIMEOUT "Chyba připojení, uplynul AP timeout"
#define D_ATTEMPTING_CONNECTION "Připojování..."
#define D_CHECKING_CONNECTION "Zkouška spojení..."

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "in Modus"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "Verbindung fehlgeschlagen, da keine IP-Adresse zugeteilt wurde"
#define D_CONNECT_FAILED_AP_NOT_REACHED "Verbindung fehlgeschlagen, da AP nicht erreicht werden konnte"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Verbindung fehlgeschlagen, da das Passwort falsch ist"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Verbindung fehlgeschlagen"
#define D_CONNECT_FAILED_AP_TIMEOUT "Verbindung fehlgeschlagen, da der AP nicht antwortet (timeout)"
#define D_ATTEMPTING_CONNECTION "Verbindungsversuch..."
#define D_CHECKING_CONNECTION "Prüfe Verbindung..."

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "σε mode"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "Αποτυχία σύνδεσης, δεν απονεμήθηκε διεύθυνση IP"
#define D_CONNECT_FAILED_AP_NOT_REACHED "Αποτυχία σύνδεσης, δεν ανταποκρίνεται το AP"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Αποτυχία σύνδεσης, λάθος κωδικός για το AP"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Αποτυχία σύνδεσης"
#define D_CONNECT_FAILED_AP_TIMEOUT "Αποτυχία σύνδεσης, λήξη ορίου απόκρισης από το AP"
#define D_ATTEMPTING_CONNECTION "Προσπάθεια για σύνδεση..."
#define D_CHECKING_CONNECTION "Έλεγχος σύνδεσης..."

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "in mode"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "Connect failed as no IP address received"
#define D_CONNECT_FAILED_AP_NOT_REACHED "Connect failed as AP cannot be reached"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Connect failed with AP incorrect password"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Connect failed"
#define D_CONNECT_FAILED_AP_TIMEOUT "Connect failed with AP timeout"
#define D_ATTEMPTING_CONNECTION "Attempting connection..."
#define D_CHECKING_CONNECTION "Checking connection..."

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "en modo"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "Falló Conexión, Dirección IP no recibida"
#define D_CONNECT_FAILED_AP_NOT_REACHED "Falló Conexión, AP no pudo ser contactado"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Falló Conexión, clave de AP incorrecta"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Falló Conexión"
#define D_CONNECT_FAILED_AP_TIMEOUT "Falló Conexión, timeout de AP"
#define D_ATTEMPTING_CONNECTION "Intentando conectar..."
#define D_CHECKING_CONNECTION "Probando conexión..."

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "en mode"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "Échec de connexion car aucune adresse IP n'a été reçue"
#define D_CONNECT_FAILED_AP_NOT_REACHED "Échec de connexion car l'AP ne peut-être contacté"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Échec de connexion car le mot de passe de l'AP est incorrect"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Échec de connexion"
#define D_CONNECT_FAILED_AP_TIMEOUT "Échec de connexion avec l'AP, expiré"
#define D_ATTEMPTING_CONNECTION "Tentative de connexion..."
#define D_CHECKING_CONNECTION "Vérification connexion..."

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "במצב"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "IP החיבור נכשל מכיוון שלא התקבלה כתובת"
#define D_CONNECT_FAILED_AP_NOT_REACHED "זמין AP החיבור נכשל כיוון שאין"
#define D_CONNECT_FAILED_WRONG_PASSWORD "סיסמא שגויה , AP חיבור נכשל ל"
#define D_CONNECT_FAILED_WRONG_PASSWORD "AP חיבור נכשל ל"
#define D_CONNECT_FAILED_AP_TIMEOUT "פג זמן המתנה , AP חיבור נכשל ל"
#define D_ATTEMPTING_CONNECTION "...מנסה להתחבר"
#define D_CHECKING_CONNECTION "...בודק חיבור"

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "mód:"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "Sikertelen csatlakozás, nincs kiosztott IP cím"
#define D_CONNECT_FAILED_AP_NOT_REACHED "Sikertelen csatlakozás, AP nem elérhető"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Sikertelen csatlakozás, hibás AP jelszó"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Sikertelen csatlakozás"
#define D_CONNECT_FAILED_AP_TIMEOUT "Sikertelen csatlakozás AP időtúllépés miatt"
#define D_ATTEMPTING_CONNECTION "Csatlakozás..."
#define D_CHECKING_CONNECTION "Kapcsolat ellenőrzése..."

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "In modalità"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "Connessione fallita - indirizzo IP non ricevuto"
#define D_CONNECT_FAILED_AP_NOT_REACHED "Connessione fallita - AP non raggiungibile"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Connessione fallita - password AP non corretta"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Connessione fallita"
#define D_CONNECT_FAILED_AP_TIMEOUT "Connessione fallita - timeout AP"
#define D_ATTEMPTING_CONNECTION "Tentativo di connessione..."
#define D_CHECKING_CONNECTION "Controllo connessione..."

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "in mode"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "IP 주소가 수신되지 않아 연결이 실패했습니다"
#define D_CONNECT_FAILED_AP_NOT_REACHED "연결이 닿지 않아 AP에 연결할 수 없습니다"
#define D_CONNECT_FAILED_WRONG_PASSWORD "비밀번호가 틀려 AP에 연결할 수 없습니다"
#define D_CONNECT_FAILED_WRONG_PASSWORD "연결할 수 없습니다"
#define D_CONNECT_FAILED_AP_TIMEOUT "시간초과로 AP에 연결할 수 없습니다"
#define D_ATTEMPTING_CONNECTION "연결 시도 중..."
#define D_CHECKING_CONNECTION "연결 체크 중..."

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "in stand"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "Verbinding mislukt omdat geen IP adres werd ontvangen"
#define D_CONNECT_FAILED_AP_NOT_REACHED "Verbinding mislukt omdat AP onbereikbaar is"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Verbinding mislukt door fout wachtwoord"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Verbinding mislukt"
#define D_CONNECT_FAILED_AP_TIMEOUT "Verbinding mislukt door AP time-out"
#define D_ATTEMPTING_CONNECTION "Verbinden..."
#define D_CHECKING_CONNECTION "Controleer verbinding..."

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "w trybie"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "Połączenie nie powiodło się, ponieważ nie otrzymano adresu IP"
#define D_CONNECT_FAILED_AP_NOT_REACHED "Połączenie nie powiodło się, AP nie osiągalny"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Połączenie nie powiodło się, nieprawidlowe hasło"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Połączenie nie powiodło się"
#define D_CONNECT_FAILED_AP_TIMEOUT "Nie udało się nawiązac połączenia, limit czasu przekroczony"
#define D_ATTEMPTING_CONNECTION "Próba połączenia..."
#define D_CHECKING_CONNECTION "Sprawdzanie połączenia..."

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "em modo"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "A ligação falhou porque nenhum endereço IP foi recebido"
#define D_CONNECT_FAILED_AP_NOT_REACHED "A ligação falhou porque o PA não pôde ser alcançado"
#define D_CONNECT_FAILED_WRONG_PASSWORD "A ligação falhou porque a senha está incorreta"
#define D_CONNECT_FAILED_WRONG_PASSWORD "A ligação falhou"
#define D_CONNECT_FAILED_AP_TIMEOUT "A ligação falhou porque o tempo foi excedido"
#define D_ATTEMPTING_CONNECTION "Ligando..."
#define D_CHECKING_CONNECTION "Verificando ligação..."

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "em modo"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "A ligação falhou porque nenhum endereço IP foi recebido"
#define D_CONNECT_FAILED_AP_NOT_REACHED "A ligação falhou porque o AP não pode ser alcançado"
#define D_CONNECT_FAILED_WRONG_PASSWORD "A ligação falhou porque a palavra chave está incorreta"
#define D_CONNECT_FAILED_WRONG_PASSWORD "A ligação falhou"
#define D_CONNECT_FAILED_AP_TIMEOUT "A ligação falhou porque o tempo excedeu"
#define D_ATTEMPTING_CONNECTION "A ligar..."
#define D_CHECKING_CONNECTION "A verificar ligação..."

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "in mode"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "Conexiune eșuată, lipsă primire adresă IP"
#define D_CONNECT_FAILED_AP_NOT_REACHED "Conexiune eșuată, nu s-a găsit AP"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Conexiune eșuată, parolă greșită AP"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Conexiune eșuată"
#define D_CONNECT_FAILED_AP_TIMEOUT "Conexiune eșuată, expirare timp AP"
#define D_ATTEMPTING_CONNECTION "Conectare in curs ..."
#define D_CHECKING_CONNECTION "Verificare conexiune..."

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "в режиме"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "Ошибка подключения, IP-адрес не получен"
#define D_CONNECT_FAILED_AP_NOT_REACHED "Ошибка соединения, AP не может быть достигнута"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Ошибка соединения, неверный пароль к AP"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Ошибка соединения"
#define D_CONNECT_FAILED_AP_TIMEOUT "Ошибка соединения с AP по тайм-ауту"
#define D_ATTEMPTING_CONNECTION "Попытка подключения..."
#define D_CHECKING_CONNECTION "Проверка соединения..."

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "v režime"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "Chyba pripojenia, nebola obdržaná IP adresa"
#define D_CONNECT_FAILED_AP_NOT_REACHED "Chyba pripojenia, nedostupný AP"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Chyba pripojenia, nesprávne heslo pre AP"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Chyba pripojenia"
#define D_CONNECT_FAILED_AP_TIMEOUT "Chyba pripojenia, uplynul AP timeout"
#define D_ATTEMPTING_CONNECTION "Pripájanie..."
#define D_CHECKING_CONNECTION "Skúška spojenia..."

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "i läge"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "Anslutning misslyckades mottog ingen IP-adress"
#define D_CONNECT_FAILED_AP_NOT_REACHED "Anslutning misslyckades, kunde inte nå AP"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Anslutning misslyckades, fel lösenord för AP"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Anslutning misslyckades"
#define D_CONNECT_FAILED_AP_TIMEOUT "Anslutning misslyckadess med AP, timeout"
#define D_ATTEMPTING_CONNECTION "Försöker ansluta..."
#define D_CHECKING_CONNECTION "Kontrollerar anslutning..."

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "modunda"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "IP adresi alınamadığı için bağlantı kurulamadı"
#define D_CONNECT_FAILED_AP_NOT_REACHED "Ap'ye ulaşılamadı"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Girilen parolayı AP kabul etmedi"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Bağlantı sağlanamadı"
#define D_CONNECT_FAILED_AP_TIMEOUT "AP'ye bağlanılırken süre aşımı oluştu"
#define D_ATTEMPTING_CONNECTION "Yeniden bağlanılıyor..."
#define D_CHECKING_CONNECTION "Bağlantı kontrol ediliyor..."

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "в режимі"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "Помилка підключення, IP-адреса не отримана"
#define D_CONNECT_FAILED_AP_NOT_REACHED "Помилка з'єднання, AP не знайдено"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Помилка з'єднання, невірне гасло до AP"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Помилка з'єднання"
#define D_CONNECT_FAILED_AP_TIMEOUT "Помилка з'єднання з AP по тайм-ауту"
#define D_ATTEMPTING_CONNECTION "Спроба підключення..."
#define D_CHECKING_CONNECTION "Перевірка з'єднання..."

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "模式:"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "连接失败,因为没有获取到 IP 地址"
#define D_CONNECT_FAILED_AP_NOT_REACHED "连接失败,无法连接 AP"
#define D_CONNECT_FAILED_WRONG_PASSWORD "连接失败AP 密码不正确"
#define D_CONNECT_FAILED_WRONG_PASSWORD "连接失败"
#define D_CONNECT_FAILED_AP_TIMEOUT "连接失败AP 超时"
#define D_ATTEMPTING_CONNECTION "尝试连接..."
#define D_CHECKING_CONNECTION "检查连接..."

View File

@ -210,7 +210,7 @@
#define D_IN_MODE "模式:"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "連接失敗因為沒有獲取到IP地址"
#define D_CONNECT_FAILED_AP_NOT_REACHED "連接失敗無法連接AP"
#define D_CONNECT_FAILED_WRONG_PASSWORD "連接失敗AP密碼不正確"
#define D_CONNECT_FAILED_WRONG_PASSWORD "連接失敗"
#define D_CONNECT_FAILED_AP_TIMEOUT "連接失敗AP超時"
#define D_ATTEMPTING_CONNECTION "嘗試連接..."
#define D_CHECKING_CONNECTION "檢查連接..."

View File

@ -470,8 +470,10 @@ struct SYSCFG {
uint8_t bri_preset_low; // F06
uint8_t bri_preset_high; // F07
int8_t hum_comp; // F08
uint8_t channel; // F09
uint8_t bssid[6]; // F0A
uint8_t free_f09[175]; // F09
uint8_t free_f10[168]; // F10
uint16_t pulse_counter_debounce_low; // FB8
uint16_t pulse_counter_debounce_high; // FBA

View File

@ -1298,8 +1298,8 @@ void SettingsDelta(void)
Settings.tuya_fnid_map[tuyaindex].dpid = 1;
tuyaindex++;
}
if (Settings.param[P_ex_TUYA_RELAYS] > 0) {
for (uint8_t i = 0 ; i < Settings.param[P_ex_TUYA_RELAYS]; i++) { // ex SetOption41
if (Settings.param[P_ARP_GRATUITOUS] > 0) { // Was P_ex_TUYA_RELAYS
for (uint8_t i = 0 ; i < Settings.param[P_ARP_GRATUITOUS]; i++) { // ex SetOption41
Settings.tuya_fnid_map[tuyaindex].fnid = 12 + i; // TUYA_MCU_FUNC_REL2 - Create FnID for Switches
Settings.tuya_fnid_map[tuyaindex].dpid = i + 2;
tuyaindex++;

View File

@ -814,6 +814,9 @@ void PerformEverySecond(void)
}
}
}
// Wifi keep alive to send Gratuitous ARP
wifiKeepAlive();
}
/*-------------------------------------------------------------------------------------------*\

View File

@ -401,6 +401,11 @@ void WifiCheckIp(void)
Settings.ip_address[1] = (uint32_t)WiFi.gatewayIP();
Settings.ip_address[2] = (uint32_t)WiFi.subnetMask();
Settings.ip_address[3] = (uint32_t)WiFi.dnsIP();
// Save current AP parameters for quick reconnect
Settings.channel = WiFi.channel();
uint8_t *bssid = WiFi.BSSID();
memcpy((void*) &Settings.bssid, (void*) bssid, sizeof(Settings.bssid));
}
Wifi.status = WL_CONNECTED;
#ifdef USE_DISCOVERY
@ -423,6 +428,7 @@ void WifiCheckIp(void)
break;
case WL_NO_SSID_AVAIL:
AddLog_P(LOG_LEVEL_INFO, S_LOG_WIFI, PSTR(D_CONNECT_FAILED_AP_NOT_REACHED));
Settings.channel = 0; // Disable stored AP
if (WIFI_WAIT == Settings.sta_config) {
Wifi.retry = Wifi.retry_init;
} else {
@ -436,6 +442,7 @@ void WifiCheckIp(void)
break;
case WL_CONNECT_FAILED:
AddLog_P(LOG_LEVEL_INFO, S_LOG_WIFI, PSTR(D_CONNECT_FAILED_WRONG_PASSWORD));
Settings.channel = 0; // Disable stored AP
if (Wifi.retry > (Wifi.retry_init / 2)) {
Wifi.retry = Wifi.retry_init / 2;
}
@ -446,8 +453,10 @@ void WifiCheckIp(void)
default: // WL_IDLE_STATUS and WL_DISCONNECTED
if (!Wifi.retry || ((Wifi.retry_init / 2) == Wifi.retry)) {
AddLog_P(LOG_LEVEL_INFO, S_LOG_WIFI, PSTR(D_CONNECT_FAILED_AP_TIMEOUT));
Settings.channel = 0; // Disable stored AP
} else {
if (!strlen(SettingsText(SET_STASSID1)) && !strlen(SettingsText(SET_STASSID2))) {
Settings.channel = 0; // Disable stored AP
wifi_config_tool = WIFI_MANAGER; // Skip empty SSIDs and start Wifi config tool
Wifi.retry = 0;
} else {
@ -462,7 +471,7 @@ void WifiCheckIp(void)
}
} else {
if (Wifi.retry_init == Wifi.retry) {
WifiBegin(3, 0); // Select default SSID
WifiBegin(3, Settings.channel); // Select default SSID
}
if ((Settings.sta_config != WIFI_WAIT) && ((Wifi.retry_init / 2) == Wifi.retry)) {
WifiBegin(2, 0); // Select alternate SSID
@ -650,6 +659,8 @@ void WifiConnect(void)
Wifi.retry = Wifi.retry_init;
Wifi.counter = 1;
memcpy((void*) &Wifi.bssid, (void*) Settings.bssid, sizeof(Wifi.bssid));
#ifdef WIFI_RF_PRE_INIT
if (rf_pre_init_flag) {
AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_WIFI "Pre-init done"));
@ -700,3 +711,51 @@ void EspRestart(void)
// ESP.restart(); // This results in exception 3 on restarts on core 2.3.0
ESP.reset();
}
//
// Gratuitous ARP, backported from https://github.com/esp8266/Arduino/pull/6889
//
extern "C" {
#if LWIP_VERSION_MAJOR == 1
#include "netif/wlan_lwip_if.h" // eagle_lwip_getif()
#include "netif/etharp.h" // gratuitous arp
#else
#include "lwip/etharp.h" // gratuitous arp
#endif
}
unsigned long wifiTimer = 0;
void stationKeepAliveNow(void) {
AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_WIFI "Sending Gratuitous ARP"));
for (netif* interface = netif_list; interface != nullptr; interface = interface->next)
if (
(interface->flags & NETIF_FLAG_LINK_UP)
&& (interface->flags & NETIF_FLAG_UP)
#if LWIP_VERSION_MAJOR == 1
&& interface == eagle_lwip_getif(STATION_IF) /* lwip1 does not set if->num properly */
&& (!ip_addr_isany(&interface->ip_addr))
#else
&& interface->num == STATION_IF
&& (!ip4_addr_isany_val(*netif_ip4_addr(interface)))
#endif
)
{
etharp_gratuitous(interface);
break;
}
}
void wifiKeepAlive(void) {
uint32_t wifiTimerSec = Settings.param[P_ARP_GRATUITOUS]; // 8-bits number of seconds, or minutes if > 100
if ((WL_CONNECTED != Wifi.status) || (0 == wifiTimerSec)) { return; } // quick exit if wifi not connected or feature disabled
if (TimeReached(wifiTimer)) {
stationKeepAliveNow();
if (wifiTimerSec > 100) {
wifiTimerSec = (wifiTimerSec - 100) * 60; // convert >100 as minutes, ex: 105 = 5 minutes, 110 = 10 minutes
}
SetNextTimeInterval(wifiTimer, wifiTimerSec * 1000);
}
}

View File

@ -256,7 +256,7 @@ enum ButtonStates { PRESSED, NOT_PRESSED };
enum Shortcuts { SC_CLEAR, SC_DEFAULT, SC_USER };
enum SettingsParamIndex { P_HOLD_TIME, P_MAX_POWER_RETRY, P_BACKLOG_DELAY, P_MDNS_DELAYED_START, P_BOOT_LOOP_OFFSET, P_RGB_REMAP, P_IR_UNKNOW_THRESHOLD, // SetOption32 .. SetOption38
P_CSE7766_INVALID_POWER, P_HOLD_IGNORE, P_ex_TUYA_RELAYS, P_OVER_TEMP, // SetOption39 .. SetOption42
P_CSE7766_INVALID_POWER, P_HOLD_IGNORE, P_ARP_GRATUITOUS, P_OVER_TEMP, // SetOption39 .. SetOption42
P_ex_DIMMER_MAX, P_ex_TUYA_VOLTAGE_ID, P_ex_TUYA_CURRENT_ID, P_ex_TUYA_POWER_ID, // SetOption43 .. SetOption46
P_ex_ENERGY_TARIFF1, P_ex_ENERGY_TARIFF2, // SetOption47 .. SetOption48
P_MAX_PARAM8 }; // Max is PARAM8_SIZE (18) - SetOption32 until SetOption49