diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6e46691b..c03cf2a2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,12 +3,20 @@
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).
-## [Unreleased]
+## [1.4.0] 2016-12-31
### Added
- Domoticz support via MQTT (https://www.domoticz.com/wiki/MQTT)
+- Support for static IP connections
+
+### Fixed
+- #16 Enforce minimum password strength in web interface
### Changed
- Using default client_id provided by AsyncMqttClient
+- Allow up to 5 different WIFI networks
+
+### Removed
+- File system version file
## [1.3.1] 2016-12-31
### Fixed
@@ -126,8 +134,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
### Changed
- Moving wifi management to library (JustWifi)
-
-### Changed
- Split code into modules
## [0.9.6] 2016-08-12
diff --git a/README.md b/README.md
index 4a4fbd21..b16af092 100644
--- a/README.md
+++ b/README.md
@@ -1,15 +1,15 @@
# ESPurna Firmware
ESPurna ("spark" in Catalan) is a custom firmware for ESP8266 based smart switches.
-It was originally developed with the **[IteadStudio Sonoff][1]** in mind but now it supports a growing number of ESP8266-based boards.
+It was originally developed with the **[IteadStudio Sonoff](https://www.itead.cc/sonoff-wifi-wireless-switch.html)** in mind but now it supports a growing number of ESP8266-based boards.
It uses the Arduino Core for ESP8266 framework and a number of 3rd party libraries.
-**Current Release Version is 1.3.1**, read the [changelog](CHANGELOG.md).
+**Current Release Version is 1.4.0**, read the [changelog](CHANGELOG.md).
## Features
* Support for **multiple ESP8266-based boards** ([check list](#supported-hardware))
-* Wifi **AP Mode** or **STA mode** with **multiple network definitions**
+* Wifi **AP Mode** or **STA mode** with **multiple network definitions** and static IP support
* **MQTT** enabled
* Switch on/off and toggle relays
* LED notifications
@@ -17,7 +17,7 @@ It uses the Arduino Core for ESP8266 framework and a number of 3rd party librari
* DHT11 / DHT22 / DHT21 / AM2301
* DS18B20
* HLW8012 (Sonoff POW)
- * Non-invasive current sensor using the [EmonLiteESP Library][3] (requires some hacking)
+ * Non-invasive current sensor using the [EmonLiteESP Library](https://bitbucket.org/xoseperez/emonliteesp) (requires some hacking)
* Fast asynchronous **HTTP Server**
* Basic authentication
* Web-based configuration
@@ -28,8 +28,9 @@ It uses the Arduino Core for ESP8266 framework and a number of 3rd party librari
* **Command line configuration**
* **Over-The-Air** (OTA) updates even for 1Mb boards
* Manually from PlatformIO or Arduino Inside
- * Automatic updates through the [NoFUSS Library][2]
+ * Automatic updates through the [NoFUSS Library](https://bitbucket.org/xoseperez/nofuss)
* **Alexa** integration (requires staging version of Arduino Core for ESP8266)
+* [**Domoticz**](https://domoticz.com/) integration via MQTT
## Documentation
@@ -61,8 +62,3 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
-
-
-[1]: https://www.itead.cc/sonoff-wifi-wireless-switch.html
-[2]: https://bitbucket.org/xoseperez/nofuss
-[3]: https://bitbucket.org/xoseperez/emonliteesp
diff --git a/code/espurna/config/general.h b/code/espurna/config/general.h
index c153bbdf..3d06436b 100644
--- a/code/espurna/config/general.h
+++ b/code/espurna/config/general.h
@@ -6,7 +6,6 @@
#define HOSTNAME DEVICE
#define BUFFER_SIZE 1024
#define HEARTBEAT_INTERVAL 300000
-#define FS_VERSION_FILE "/fsversion"
//--------------------------------------------------------------------------------
// RELAY
diff --git a/code/espurna/config/version.h b/code/espurna/config/version.h
index ab3295d3..1fccd043 100644
--- a/code/espurna/config/version.h
+++ b/code/espurna/config/version.h
@@ -1,4 +1,4 @@
#define APP_NAME "ESPurna"
-#define APP_VERSION "1.3.1"
+#define APP_VERSION "1.4.0"
#define APP_AUTHOR "xose.perez@gmail.com"
#define APP_WEBSITE "http://tinkerman.cat"
diff --git a/code/espurna/data/fsversion b/code/espurna/data/fsversion
deleted file mode 100644
index f0bb29e7..00000000
--- a/code/espurna/data/fsversion
+++ /dev/null
@@ -1 +0,0 @@
-1.3.0
diff --git a/code/espurna/data/index.html.gz b/code/espurna/data/index.html.gz
index d879c641..29724261 100644
Binary files a/code/espurna/data/index.html.gz and b/code/espurna/data/index.html.gz differ
diff --git a/code/espurna/data/script.js.gz b/code/espurna/data/script.js.gz
index 046d536b..777cb053 100644
Binary files a/code/espurna/data/script.js.gz and b/code/espurna/data/script.js.gz differ
diff --git a/code/espurna/data/style.css.gz b/code/espurna/data/style.css.gz
index 1ed7c596..c6e249dc 100644
Binary files a/code/espurna/data/style.css.gz and b/code/espurna/data/style.css.gz differ
diff --git a/code/espurna/espurna.ino b/code/espurna/espurna.ino
index 24b6ae57..874b6744 100644
--- a/code/espurna/espurna.ino
+++ b/code/espurna/espurna.ino
@@ -28,7 +28,7 @@ along with this program. If not, see .
#include
#include
#include
-#include "FS.h"
+
void mqttRegister(void (*callback)(unsigned int, const char *, const char *));
template bool setSetting(const String& key, T value);
template String getSetting(const String& key, T defaultValue);
@@ -48,18 +48,6 @@ void hardwareSetup() {
SPIFFS.begin();
}
-void getFSVersion(char * buffer) {
- File h = SPIFFS.open(FS_VERSION_FILE, "r");
- if (!h) {
- DEBUG_MSG("[SPIFFS] Could not open file system version file.\n");
- strcpy(buffer, APP_VERSION);
- return;
- }
- size_t size = h.size();
- h.readBytes(buffer, size - 1);
- h.close();
-}
-
void hardwareLoop() {
// Heartbeat
diff --git a/code/espurna/mqtt.ino b/code/espurna/mqtt.ino
index 8b9dc84a..d47d5f58 100644
--- a/code/espurna/mqtt.ino
+++ b/code/espurna/mqtt.ino
@@ -84,9 +84,6 @@ void _mqttOnConnect(bool sessionPresent) {
// Say hello and report our IP and VERSION
mqttSend(MQTT_IP_TOPIC, getIP().c_str());
mqttSend(MQTT_VERSION_TOPIC, APP_VERSION);
- char buffer[50];
- getFSVersion(buffer);
- mqttSend(MQTT_FSVERSION_TOPIC, buffer);
// Send connect event to subscribers
for (unsigned char i = 0; i < _mqtt_callbacks.size(); i++) {
diff --git a/code/espurna/web.ino b/code/espurna/web.ino
index 327dcbe7..1905d166 100644
--- a/code/espurna/web.ino
+++ b/code/espurna/web.ino
@@ -177,6 +177,7 @@ void _wsParse(uint32_t client_id, uint8_t * payload, size_t length) {
}
if (value != getSetting(key)) {
+ //DEBUG_MSG("[WEBSOCKET] Storing %s = %s\n", key.c_str(), value.c_str());
setSetting(key, value);
dirty = true;
if (key.startsWith("mqtt")) dirtyMQTT = true;
diff --git a/code/gulpfile.js b/code/gulpfile.js
index 181cfeb4..1bf02633 100644
--- a/code/gulpfile.js
+++ b/code/gulpfile.js
@@ -91,4 +91,4 @@ gulp.task('html', function() {
/* Build file system */
gulp.task('buildfs_split', ['clean', 'files', 'html']);
gulp.task('buildfs_inline', ['clean', 'files', 'inline']);
-gulp.task('default', ['buildfs_inline']);
+gulp.task('default', ['buildfs_split']);
diff --git a/code/html/fsversion b/code/html/fsversion
deleted file mode 100644
index 3a3cd8cc..00000000
--- a/code/html/fsversion
+++ /dev/null
@@ -1 +0,0 @@
-1.3.1
diff --git a/code/html/index.html b/code/html/index.html
index 3e9718ae..ee8ab0c2 100644
--- a/code/html/index.html
+++ b/code/html/index.html
@@ -388,12 +388,12 @@