diff --git a/ConfigSettings.cpp b/ConfigSettings.cpp index fd77bdd..c930434 100644 --- a/ConfigSettings.cpp +++ b/ConfigSettings.cpp @@ -57,6 +57,7 @@ double BaseSettings::parseValueDouble(JsonObject &obj, const char *prop, double } bool ConfigSettings::begin() { uint32_t chipId = 0; + uint64_t mac = ESP.getEfuseMac(); for(int i=0; i<17; i=i+8) { chipId |= ((mac >> (40 - i)) & 0xff) << i; @@ -80,6 +81,7 @@ bool ConfigSettings::load() { pref.getString("hostname", this->hostname, sizeof(this->hostname)); this->ssdpBroadcast = pref.getBool("ssdpBroadcast", true); this->connType = static_cast(pref.getChar("connType", 0x00)); + Serial.printf("Preference GFG Free Entries: %d\n", pref.freeEntries()); pref.end(); if(this->connType == conn_types::unset) { // We are doing this to convert the data from previous versions. @@ -290,6 +292,7 @@ bool IPSettings::load() { pref.getString("dns2", buff, sizeof(buff)); this->dns2.fromString(buff); } + Serial.printf("Preference IP Free Entries: %d\n", pref.freeEntries()); pref.end(); return true; } diff --git a/ConfigSettings.h b/ConfigSettings.h index 96dbc7f..83253ba 100644 --- a/ConfigSettings.h +++ b/ConfigSettings.h @@ -3,7 +3,7 @@ #ifndef configsettings_h #define configsettings_h -#define FW_VERSION "v2.0.0" +#define FW_VERSION "v2.0.1" enum DeviceStatus { DS_OK = 0, DS_ERROR = 1, @@ -25,7 +25,7 @@ class BaseSettings { }; class NTPSettings: BaseSettings { public: - char ntpServer[64] = "pool.ntp.org"; + char ntpServer[65] = "pool.ntp.org"; char posixZone[64] = ""; bool fromJSON(JsonObject &obj); bool toJSON(JsonObject &obj); @@ -38,8 +38,8 @@ class NTPSettings: BaseSettings { class WifiSettings: BaseSettings { public: WifiSettings(); - char ssid[64] = ""; - char passphrase[64] = ""; + char ssid[65] = ""; + char passphrase[65] = ""; //bool ssdpBroadcast = true; bool begin(); bool fromJSON(JsonObject &obj); @@ -111,12 +111,12 @@ class SecuritySettings: BaseSettings { class MQTTSettings: BaseSettings { public: bool enabled = false; - char hostname[32] = ""; + char hostname[65] = ""; char protocol[10] = "mqtt://"; uint16_t port = 1883; - char username[32] = ""; - char password[32] = ""; - char rootTopic[64] = ""; + char username[33] = ""; + char password[33] = ""; + char rootTopic[65] = ""; bool begin(); bool save(); bool load(); diff --git a/Somfy.cpp b/Somfy.cpp index 5aab300..6dd026b 100644 --- a/Somfy.cpp +++ b/Somfy.cpp @@ -2817,6 +2817,8 @@ void Transceiver::emitFrame(somfy_frame_t *frame, somfy_rx_t *rx) { evt.appendMessage(buf); snprintf(buf, sizeof(buf), "\"bits\":%d,", rx->bit_length); evt.appendMessage(buf); + snprintf(buf, sizeof(buf), "\"proto\":%d,", static_cast(frame->proto)); + evt.appendMessage(buf); snprintf(buf, sizeof(buf), "\"valid\":%s,", frame->valid ? "true" : "false"); evt.appendMessage(buf); snprintf(buf, sizeof(buf), "\"sync\":%d,\"pulses\":[", frame->hwsync); diff --git a/SomfyController.ino.esp32.bin b/SomfyController.ino.esp32.bin index 1f2fe1b..2f694c5 100644 Binary files a/SomfyController.ino.esp32.bin and b/SomfyController.ino.esp32.bin differ diff --git a/SomfyController.littlefs.bin b/SomfyController.littlefs.bin index 0818e57..5880f22 100644 Binary files a/SomfyController.littlefs.bin and b/SomfyController.littlefs.bin differ diff --git a/Web.cpp b/Web.cpp index fe1dd7a..9b1be3d 100644 --- a/Web.cpp +++ b/Web.cpp @@ -2131,7 +2131,7 @@ void Web::begin() { }); server.on("/connectmqtt", []() { if(server.method() == HTTP_OPTIONS) { server.send(200, "OK"); return; } - DynamicJsonDocument doc(512); + DynamicJsonDocument doc(1024); DeserializationError err = deserializeJson(doc, server.arg("plain")); if (err) { Serial.print("Error parsing JSON "); @@ -2150,7 +2150,7 @@ void Web::begin() { settings.MQTT.fromJSON(obj); settings.MQTT.save(); - StaticJsonDocument<512> sdoc; + DynamicJsonDocument sdoc(1024); JsonObject sobj = sdoc.to(); settings.MQTT.toJSON(sobj); serializeJson(sdoc, g_content); @@ -2163,7 +2163,7 @@ void Web::begin() { }); server.on("/mqttsettings", []() { webServer.sendCORSHeaders(); - DynamicJsonDocument doc(512); + DynamicJsonDocument doc(1024); JsonObject obj = doc.to(); settings.MQTT.toJSON(obj); serializeJson(doc, g_content); diff --git a/data/index.html b/data/index.html index 4096f2d..697451d 100644 --- a/data/index.html +++ b/data/index.html @@ -3,11 +3,11 @@ - - + + - +
@@ -251,7 +251,7 @@ :// - + :
@@ -291,6 +291,7 @@ diff --git a/data/index.js b/data/index.js index 0e677d4..b1ad926 100644 --- a/data/index.js +++ b/data/index.js @@ -1186,7 +1186,7 @@ var security = new Security(); class General { initialized = false; - appVersion = 'v2.0.0'; + appVersion = 'v2.0.1'; reloadApp = false; init() { if (this.initialized) return; @@ -1380,15 +1380,19 @@ class General { let pnl = document.getElementById('divSystemSettings'); let obj = ui.fromElement(pnl).general; if (typeof obj.hostname === 'undefined' || !obj.hostname || obj.hostname === '') { - ui.errorMessage(pnl, 'You must supply a valid host name.'); + ui.errorMessage('Invalid Host Name').querySelector('.sub-message').innerHTML = 'You must supply a valid Host Name.'; valid = false; } if (valid && !/^[a-zA-Z0-9-]+$/.test(obj.hostname)) { - ui.errorMessage(pnl, 'The host name must only include numbers, letters, or dash.'); + ui.errorMessage('Invalid Host Name').querySelector('.sub-message').innerHTML = 'The host name must only include numbers, letters, or dash.'; valid = false; } if (valid && obj.hostname.length > 32) { - ui.errorMessage(pnl, 'The host name can only be up to 32 characters long.'); + ui.errorMessage('Invalid Host Name').querySelector('.sub-message').innerHTML = 'The maximum Host Name length is 32 characters.'; + valid = false; + } + if (valid && typeof obj.ntpServer === 'string' && obj.ntpServer.length > 64) { + ui.errorMessage('Invalid NTP Server').querySelector('.sub-message').innerHTML = 'The maximum NTP Server length is 64 characters.'; valid = false; } if (valid) { @@ -1471,10 +1475,20 @@ class General { ui.errorMessage('No Username Provided').querySelector('.sub-message').innerHTML = 'You must provide a username for password security.'; return; } + if (sec.username.length > 32) { + ui.errorMessage('Invalid Username').querySelector('.sub-message').innerHTML = 'The maximum username length is 32 characters.'; + return; + } + if (sec.password.length === 0) { ui.errorMessage('No Password Provided').querySelector('.sub-message').innerHTML = 'You must provide a password for password security.'; return; } + if (sec.password.length > 32) { + ui.errorMessage('Invalid Password').querySelector('.sub-message').innerHTML = 'The maximum password length is 32 characters.'; + return; + } + if (security.repeatpassword.length === 0) { ui.errorMessage('Re-enter Password').querySelector('.sub-message').innerHTML = 'You must re-enter the password in the Re-enter Password field.'; return; @@ -1647,7 +1661,7 @@ class Wifi { encryption: el.getAttribute('data-encryption'), strength: parseInt(el.getAttribute('data-strength'), 10), channel: parseInt(el.getAttribute('data-channel'), 10) - } + }; console.log(obj); document.getElementsByName('ssid')[0].value = obj.name; } @@ -1762,7 +1776,17 @@ class Wifi { let obj = { ssid: document.getElementsByName('ssid')[0].value, passphrase: document.getElementsByName('passphrase')[0].value + }; + if (obj.ssid.length > 64) { + ui.errorMessage('Invalid SSID').querySelector('.sub-message').innerHTML = 'The maximum length of the SSID is 64 characters.'; + return; } + if (obj.passphrase.length > 64) { + ui.errorMessage('Invalid Passphrase').querySelector('.sub-message').innerHTML = 'The maximum length of the passphrase is 64 characters.'; + return; + } + + let overlay = ui.waitMessage(document.getElementById('divNetAdapter')); putJSON('/connectwifi', obj, (err, response) => { overlay.remove(); @@ -2280,12 +2304,21 @@ class Somfy { // the browser. let fnFmtDate = (dt) => { return `${(dt.getMonth() + 1).fmt('00')}/${dt.getDate().fmt('00')} ${dt.getHours().fmt('00')}:${dt.getMinutes().fmt('00')}:${dt.getSeconds().fmt('00')}.${dt.getMilliseconds().fmt('000')}`; - } + }; let fnFmtTime = (dt) => { return `${dt.getHours().fmt('00')}:${dt.getMinutes().fmt('00')}:${dt.getSeconds().fmt('00')}.${dt.getMilliseconds().fmt('000')}`; - } + }; frame.time = new Date(); - let html = `${frame.encKey}${frame.address}${frame.command}${frame.rcode}${frame.rssi}dBm${frame.bits}${fnFmtTime(frame.time)}
`; + let proto = '-S'; + switch (frame.proto) { + case 1: + proto = '-W'; + break; + case 2: + proto = '-V'; + break; + } + let html = `${frame.encKey}${frame.address}${frame.command}${frame.rcode}${frame.rssi}dBm${frame.bits}${proto}${fnFmtTime(frame.time)}
`; for (let i = 0; i < frame.pulses.length; i++) { if (i !== 0) html += ','; html += `${frame.pulses[i]}`; @@ -3204,16 +3237,30 @@ class MQTT { console.log(obj); if (obj.mqtt.enabled) { if (typeof obj.mqtt.hostname !== 'string' || obj.mqtt.hostname.length === 0) { - ui.errorMessage('Invalid host name.').querySelector('.sub-message').innerHTML = 'You must supply a host name to connect to MQTT.'; + ui.errorMessage('Invalid host name').querySelector('.sub-message').innerHTML = 'You must supply a host name to connect to MQTT.'; + return; + } + if (obj.mqtt.hostname.length > 64) { + ui.errorMessage('Invalid host name').querySelector('.sub-message').innerHTML = 'The maximum length of the host name is 64 characters.'; return; } if (isNaN(obj.mqtt.port) || obj.mqtt.port < 0) { - ui.errorMessage('Invalid port number.').querySelector('.sub-message').innerHTML = 'Likely ports are 1183, 8883 for MQTT/S or 80,443 for HTTP/S'; + ui.errorMessage('Invalid port number').querySelector('.sub-message').innerHTML = 'Likely ports are 1183, 8883 for MQTT/S or 80,443 for HTTP/S'; + return; + } + if (typeof obj.mqtt.username === 'string' && obj.mqtt.username.length > 32) { + ui.errorMessage('Invalid Username').querySelector('.sub-message').innerHTML = 'The maximum length of the username is 32 characters.'; + return; + } + if (typeof obj.mqtt.password === 'string' && obj.mqtt.password.length > 32) { + ui.errorMessage('Invalid Password').querySelector('.sub-message').innerHTML = 'The maximum length of the password is 32 characters.'; + return; + } + if (typeof obj.mqtt.rootTopic === 'string' && obj.mqtt.rootTopic.length > 64) { + ui.errorMessage('Invalid Root Topic').querySelector('.sub-message').innerHTML = 'The maximum length of the root topic is 64 characters.'; return; } - } - putJSONSync('/connectmqtt', obj.mqtt, (err, response) => { if (err) ui.serviceError(err); console.log(response); diff --git a/data/main.css b/data/main.css index 7eab8d2..92575f3 100644 --- a/data/main.css +++ b/data/main.css @@ -769,20 +769,20 @@ div.frame-header > span { } div.frame-row > span:nth-child(1), div.frame-header > span:nth-child(1) { - width:30px; + width:25px; } div.frame-row > span:nth-child(2), div.frame-header > span:nth-child(2) { - width: 67px; + width: 64px; } div.frame-row > span:nth-child(3), div.frame-header > span:nth-child(3) { - width: 77px; + width: 80px; text-align:center; } div.frame-row > span:nth-child(4), div.frame-header > span:nth-child(4) { - width: 50px; + width: 43px; } div.frame-row > span:nth-child(5), div.frame-header > span:nth-child(5) { @@ -790,7 +790,7 @@ div.frame-header > span { } div.frame-row > span:nth-child(6), div.frame-header > span:nth-child(6) { - width: 27px; + width: 42px; text-align:center; } div.frame-row > span:nth-child(7),