From 1715b653e422fce9bb01b76da08fc49cab6fa3a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Wed, 11 Jan 2017 14:25:16 +0100 Subject: [PATCH 01/15] Using forked Time library to prevent conflict with Arduino Core for ESP8266 time.h file in windows machines --- code/platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/platformio.ini b/code/platformio.ini index 94bfd8b2..38c254c0 100644 --- a/code/platformio.ini +++ b/code/platformio.ini @@ -7,7 +7,7 @@ data_dir = espurna/data lib_deps = DHT sensor library Adafruit Unified Sensor - Time + https://github.com/xoseperez/Time ArduinoJson ESPAsyncTCP ESPAsyncWebServer From ff813268465f21ea938db1e36ad45df376378671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Wed, 11 Jan 2017 14:29:05 +0100 Subject: [PATCH 02/15] Version and year bump --- CHANGELOG.md | 7 +++++++ README.md | 4 ++-- code/espurna/button.ino | 2 +- code/espurna/config/version.h | 2 +- code/espurna/dht.ino | 2 +- code/espurna/domoticz.ino | 2 +- code/espurna/ds18b20.ino | 2 +- code/espurna/emon.ino | 2 +- code/espurna/espurna.ino | 2 +- code/espurna/fauxmo.ino | 2 +- code/espurna/led.ino | 2 +- code/espurna/mqtt.ino | 2 +- code/espurna/nofuss.ino | 2 +- code/espurna/ntp.ino | 2 +- code/espurna/ota.ino | 2 +- code/espurna/pow.ino | 2 +- code/espurna/relay.ino | 2 +- code/espurna/rf.ino | 2 +- code/espurna/settings.ino | 2 +- code/espurna/web.ino | 2 +- code/espurna/wifi.ino | 2 +- 21 files changed, 28 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b41f4a4d..5772eb7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,14 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## [1.4.3] 2017-01-11 +### Fixed +- #6 Using forked Time library to prevent conflict with Arduino Core for ESP8266 time.h file in windows machines + ## [1.4.2] 2017-01-09 +### Added +- Support for inverse logic relays + ### Fixed - Fixed error in relay identification from MQTT messages (issue #31) diff --git a/README.md b/README.md index 4a9031c3..800d00d3 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ESPurna ("spark" in Catalan) is a custom firmware for ESP8266 based smart switch 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.4.2**, read the [changelog](CHANGELOG.md). +**Current Release Version is 1.4.3**, read the [changelog](CHANGELOG.md). ## Features @@ -48,7 +48,7 @@ For more information please refer to the [ESPurna Wiki](https://bitbucket.org/xo ## License -Copyright (C) 2016 by Xose Pérez (@xoseperez) +Copyright (C) 2016-2017 by Xose Pérez (@xoseperez) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/code/espurna/button.ino b/code/espurna/button.ino index baaaca41..5edc3b99 100644 --- a/code/espurna/button.ino +++ b/code/espurna/button.ino @@ -3,7 +3,7 @@ ESPurna BUTTON MODULE -Copyright (C) 2016 by Xose Pérez +Copyright (C) 2016-2017 by Xose Pérez */ diff --git a/code/espurna/config/version.h b/code/espurna/config/version.h index 448d7a24..d380d7b4 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.4.2" +#define APP_VERSION "1.4.3" #define APP_AUTHOR "xose.perez@gmail.com" #define APP_WEBSITE "http://tinkerman.cat" diff --git a/code/espurna/dht.ino b/code/espurna/dht.ino index 4da26661..a556ae52 100644 --- a/code/espurna/dht.ino +++ b/code/espurna/dht.ino @@ -3,7 +3,7 @@ ESPurna DHT MODULE -Copyright (C) 2016 by Xose Pérez +Copyright (C) 2016-2017 by Xose Pérez */ diff --git a/code/espurna/domoticz.ino b/code/espurna/domoticz.ino index be9b4e59..0a5f0188 100644 --- a/code/espurna/domoticz.ino +++ b/code/espurna/domoticz.ino @@ -3,7 +3,7 @@ ESPurna DOMOTICZ MODULE -Copyright (C) 2016 by Xose Pérez +Copyright (C) 2016-2017 by Xose Pérez */ diff --git a/code/espurna/ds18b20.ino b/code/espurna/ds18b20.ino index 7ea03cf1..6c3cb311 100644 --- a/code/espurna/ds18b20.ino +++ b/code/espurna/ds18b20.ino @@ -3,7 +3,7 @@ ESPurna SD18B20 MODULE -Copyright (C) 2016 by Xose Pérez +Copyright (C) 2016-2017 by Xose Pérez */ diff --git a/code/espurna/emon.ino b/code/espurna/emon.ino index 7bb21e20..8ffe46df 100644 --- a/code/espurna/emon.ino +++ b/code/espurna/emon.ino @@ -3,7 +3,7 @@ ESPurna EMON MODULE -Copyright (C) 2016 by Xose Pérez +Copyright (C) 2016-2017 by Xose Pérez */ diff --git a/code/espurna/espurna.ino b/code/espurna/espurna.ino index e91a6d30..0031b9dc 100644 --- a/code/espurna/espurna.ino +++ b/code/espurna/espurna.ino @@ -1,7 +1,7 @@ /* ESPurna -Copyright (C) 2016 by Xose Pérez +Copyright (C) 2016-2017 by Xose Pérez This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/code/espurna/fauxmo.ino b/code/espurna/fauxmo.ino index 939f1e94..531dc3e0 100644 --- a/code/espurna/fauxmo.ino +++ b/code/espurna/fauxmo.ino @@ -3,7 +3,7 @@ ESPurna DHT MODULE -Copyright (C) 2016 by Xose Pérez +Copyright (C) 2016-2017 by Xose Pérez */ diff --git a/code/espurna/led.ino b/code/espurna/led.ino index 24d14ed8..b4549dfc 100644 --- a/code/espurna/led.ino +++ b/code/espurna/led.ino @@ -3,7 +3,7 @@ ESPurna LED MODULE -Copyright (C) 2016 by Xose Pérez +Copyright (C) 2016-2017 by Xose Pérez */ diff --git a/code/espurna/mqtt.ino b/code/espurna/mqtt.ino index d47d5f58..dd07cf88 100644 --- a/code/espurna/mqtt.ino +++ b/code/espurna/mqtt.ino @@ -3,7 +3,7 @@ ESPurna MQTT MODULE -Copyright (C) 2016 by Xose Pérez +Copyright (C) 2016-2017 by Xose Pérez */ diff --git a/code/espurna/nofuss.ino b/code/espurna/nofuss.ino index 35b1e20e..aa9ca360 100644 --- a/code/espurna/nofuss.ino +++ b/code/espurna/nofuss.ino @@ -3,7 +3,7 @@ ESPurna NOFUSS MODULE -Copyright (C) 2016 by Xose Pérez +Copyright (C) 2016-2017 by Xose Pérez */ diff --git a/code/espurna/ntp.ino b/code/espurna/ntp.ino index 7b6c158d..97839bb9 100644 --- a/code/espurna/ntp.ino +++ b/code/espurna/ntp.ino @@ -3,7 +3,7 @@ ESPURNA NTP MODULE -Copyright (C) 2016 by Xose Pérez +Copyright (C) 2016-2017 by Xose Pérez */ diff --git a/code/espurna/ota.ino b/code/espurna/ota.ino index 56048e0c..1ba8dd4a 100644 --- a/code/espurna/ota.ino +++ b/code/espurna/ota.ino @@ -3,7 +3,7 @@ ESPurna OTA MODULE -Copyright (C) 2016 by Xose Pérez +Copyright (C) 2016-2017 by Xose Pérez */ diff --git a/code/espurna/pow.ino b/code/espurna/pow.ino index bf820296..8aa5a4ea 100644 --- a/code/espurna/pow.ino +++ b/code/espurna/pow.ino @@ -4,7 +4,7 @@ ESPurna POW MODULE Support for Sonoff POW HLW8012-based power monitor -Copyright (C) 2016 by Xose Pérez +Copyright (C) 2016-2017 by Xose Pérez */ diff --git a/code/espurna/relay.ino b/code/espurna/relay.ino index ebe4d2ed..f2839447 100644 --- a/code/espurna/relay.ino +++ b/code/espurna/relay.ino @@ -3,7 +3,7 @@ ESPurna RELAY MODULE -Copyright (C) 2016 by Xose Pérez +Copyright (C) 2016-2017 by Xose Pérez */ diff --git a/code/espurna/rf.ino b/code/espurna/rf.ino index 817c0a8e..fc32697d 100644 --- a/code/espurna/rf.ino +++ b/code/espurna/rf.ino @@ -3,7 +3,7 @@ ESPurna RF MODULE -Copyright (C) 2016 by Xose Pérez +Copyright (C) 2016-2017 by Xose Pérez */ diff --git a/code/espurna/settings.ino b/code/espurna/settings.ino index b5093d72..7c643dd2 100644 --- a/code/espurna/settings.ino +++ b/code/espurna/settings.ino @@ -3,7 +3,7 @@ ESPurna SETTINGS MODULE -Copyright (C) 2016 by Xose Pérez +Copyright (C) 2016-2017 by Xose Pérez */ diff --git a/code/espurna/web.ino b/code/espurna/web.ino index ed9c29ea..c24dd109 100644 --- a/code/espurna/web.ino +++ b/code/espurna/web.ino @@ -3,7 +3,7 @@ ESPurna WEBSERVER MODULE -Copyright (C) 2016 by Xose Pérez +Copyright (C) 2016-2017 by Xose Pérez */ diff --git a/code/espurna/wifi.ino b/code/espurna/wifi.ino index 22ec197a..e7b78193 100644 --- a/code/espurna/wifi.ino +++ b/code/espurna/wifi.ino @@ -3,7 +3,7 @@ ESPurna WIFI MODULE -Copyright (C) 2016 by Xose Pérez +Copyright (C) 2016-2017 by Xose Pérez */ From 5f5eec8f16741ab1f1e493d2bbd7240135b4820f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Wed, 11 Jan 2017 23:23:02 +0100 Subject: [PATCH 03/15] Move all Arduino IDE configuration values to their own file --- code/debug | 2 +- code/espurna/config/all.h | 1 + code/espurna/config/arduino.h | 40 ++++++++++++++++++++++++++++++++++ code/espurna/config/general.h | 3 +++ code/espurna/config/hardware.h | 31 -------------------------- 5 files changed, 45 insertions(+), 32 deletions(-) create mode 100644 code/espurna/config/arduino.h diff --git a/code/debug b/code/debug index b225b90e..7ccba580 100755 --- a/code/debug +++ b/code/debug @@ -4,7 +4,7 @@ # CONFIGURATION # ------------------------------------------------------------------------------ -ENVIRONMENT="node-debug" +ENVIRONMENT="d1-debug" ADDR2LINE=$HOME/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-addr2line DECODER=utils/EspStackTraceDecoder.jar DECODER_ORIGIN=https://github.com/littleyoda/EspStackTraceDecoder/releases/download/untagged-83b6db3208da17a0f1fd/EspStackTraceDecoder.jar diff --git a/code/espurna/config/all.h b/code/espurna/config/all.h index 7c49a3e4..ddbefc6d 100644 --- a/code/espurna/config/all.h +++ b/code/espurna/config/all.h @@ -1,4 +1,5 @@ #include "version.h" +#include "arduino.h" #include "debug.h" #include "general.h" #include "hardware.h" diff --git a/code/espurna/config/arduino.h b/code/espurna/config/arduino.h new file mode 100644 index 00000000..dd6eb88c --- /dev/null +++ b/code/espurna/config/arduino.h @@ -0,0 +1,40 @@ +//-------------------------------------------------------------------------------- +// This setting is normally provided by PlatformIO +// Uncomment the appropiate line to build from the Arduino IDE +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +// General +//-------------------------------------------------------------------------------- + +//#define DEBUG_PORT Serial + +//-------------------------------------------------------------------------------- +// Hardware +//-------------------------------------------------------------------------------- + +//#define D1_RELAYSHIELD +//#define NODEMCUV2 +//#define SONOFF +//#define SONOFF_TH +//#define SLAMPHER +//#define S20 +//#define SONOFF_SV +//#define SONOFF_POW +//#define SONOFF_DUAL +//#define SONOFF_4CH +//#define ESP_RELAY_BOARD +//#define ECOPLUG +//#define ESPURNA + +//-------------------------------------------------------------------------------- +// Features +//-------------------------------------------------------------------------------- + +//#define ENABLE_DHT 1 +//#define ENABLE_DS18B20 1 +//#define ENABLE_EMON 1 +//#define ENABLE_HLW8018 1 +//#define ENABLE_RF 1 +//#define ENABLE_FAUXMO 0 +//#define ENABLE_NOFUSS 1 diff --git a/code/espurna/config/general.h b/code/espurna/config/general.h index 2d0d90f9..399f8867 100644 --- a/code/espurna/config/general.h +++ b/code/espurna/config/general.h @@ -106,4 +106,7 @@ // FAUXO // ----------------------------------------------------------------------------- +#ifndef ENABLE_FAUXMO + #define ENABLE_FAUXMO 1 +#endif #define FAUXMO_ENABLED 1 diff --git a/code/espurna/config/hardware.h b/code/espurna/config/hardware.h index a2748b94..1616de35 100644 --- a/code/espurna/config/hardware.h +++ b/code/espurna/config/hardware.h @@ -1,34 +1,3 @@ -//-------------------------------------------------------------------------------- -// HARDWARE -// This setting is normally provided by PlatformIO -// Uncomment the appropiate line to build from the Arduino IDE -//-------------------------------------------------------------------------------- - -//#define NODEMCUV2 -//#define SONOFF -//#define SONOFF_TH -//#define SLAMPHER -//#define S20 -//#define SONOFF_SV -//#define SONOFF_POW -//#define SONOFF_DUAL -//#define SONOFF_4CH -//#define ESP_RELAY_BOARD -//#define ECOPLUG -//#define ESPURNA - -//#define ENABLE_DHT 1 -//#define ENABLE_DS18B20 1 -//#define ENABLE_EMON 1 -//#define ENABLE_HLW8018 1 -//#define ENABLE_RF 1 -//#define ENABLE_FAUXMO 0 -//#define ENABLE_NOFUSS 1 - -#ifndef ENABLE_FAUXMO - #define ENABLE_FAUXMO 1 -#endif - // ----------------------------------------------------------------------------- // Development boards // ----------------------------------------------------------------------------- From 4b557535e6708079be87b8f24428ec1e3c92c413 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Wed, 11 Jan 2017 23:24:49 +0100 Subject: [PATCH 04/15] Defer wifi disconnection from web interface to allow request to return --- code/espurna/mqtt.ino | 2 +- code/espurna/web.ino | 9 ++++++++- code/espurna/wifi.ino | 5 ----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/code/espurna/mqtt.ino b/code/espurna/mqtt.ino index dd07cf88..fb19854e 100644 --- a/code/espurna/mqtt.ino +++ b/code/espurna/mqtt.ino @@ -94,7 +94,7 @@ void _mqttOnConnect(bool sessionPresent) { void _mqttOnDisconnect(AsyncMqttClientDisconnectReason reason) { - DEBUG_MSG("[MQTT] Disconnected!\n"); + DEBUG_MSG("[MQTT] Disconnected\n"); // Send disconnect 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 c24dd109..4cf37b23 100644 --- a/code/espurna/web.ino +++ b/code/espurna/web.ino @@ -14,6 +14,7 @@ Copyright (C) 2016-2017 by Xose Pérez #include #include #include +#include AsyncWebServer server(80); AsyncWebSocket ws("/ws"); @@ -24,6 +25,7 @@ typedef struct { } ws_ticket_t; ws_ticket_t _ticket[WS_BUFFER_SIZE]; +Ticker deferred; // ----------------------------------------------------------------------------- // WEBSOCKETS @@ -75,7 +77,12 @@ void _wsParse(uint32_t client_id, uint8_t * payload, size_t length) { DEBUG_MSG("[WEBSOCKET] Requested action: %s\n", action.c_str()); if (action.equals("reset")) ESP.reset(); - if (action.equals("reconnect")) wifiDisconnect(); + if (action.equals("reconnect")) { + + // Let the HTTP request return and disconnect after 100ms + deferred.once_ms(100, wifiDisconnect); + + } if (action.equals("on")) relayStatus(relayID, true); if (action.equals("off")) relayStatus(relayID, false); diff --git a/code/espurna/wifi.ino b/code/espurna/wifi.ino index e7b78193..0db7a93b 100644 --- a/code/espurna/wifi.ino +++ b/code/espurna/wifi.ino @@ -148,11 +148,6 @@ void wifiSetup() { #endif - // Disconnect from MQTT server if no WIFI - if (code != MESSAGE_CONNECTED) { - if (mqttConnected()) mqttDisconnect(); - } - // Configure mDNS if (code == MESSAGE_CONNECTED) { From 476d3144980ede6328cf2ba52c282f9eaf335ef6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Wed, 11 Jan 2017 23:25:46 +0100 Subject: [PATCH 05/15] Fix #35 using stable version of ESPAsyncTCP and updated version of JustWifi to prevent MQTT connection drop after wifi reconnection --- code/platformio.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/platformio.ini b/code/platformio.ini index 38c254c0..6c8b1028 100644 --- a/code/platformio.ini +++ b/code/platformio.ini @@ -9,14 +9,14 @@ lib_deps = Adafruit Unified Sensor https://github.com/xoseperez/Time ArduinoJson - ESPAsyncTCP + https://github.com/me-no-dev/ESPAsyncTCP#e074eaac ESPAsyncWebServer https://github.com/marvinroger/async-mqtt-client Embedis NtpClientLib OneWire DallasTemperature - JustWifi + https://bitbucket.org/xoseperez/justwifi.git HLW8012 https://bitbucket.org/xoseperez/fauxmoesp.git https://bitbucket.org/xoseperez/nofuss.git From 252bcbdded0bdb11bf44e14d5cd54ac006e2dce9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Thu, 12 Jan 2017 00:16:53 +0100 Subject: [PATCH 06/15] Force MQTT close client before reconnecting. Revert back to latest ESPAsyncTCP --- code/espurna/mqtt.ino | 2 ++ code/platformio.ini | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/code/espurna/mqtt.ino b/code/espurna/mqtt.ino index fb19854e..945d045d 100644 --- a/code/espurna/mqtt.ino +++ b/code/espurna/mqtt.ino @@ -131,6 +131,8 @@ void mqttConnect() { if (!mqtt.connected()) { + mqtt.disconnect(); + char * host = strdup(getSetting("mqttServer", MQTT_SERVER).c_str()); if (strlen(host) == 0) return; unsigned int port = getSetting("mqttPort", MQTT_PORT).toInt(); diff --git a/code/platformio.ini b/code/platformio.ini index 6c8b1028..b8044901 100644 --- a/code/platformio.ini +++ b/code/platformio.ini @@ -9,7 +9,7 @@ lib_deps = Adafruit Unified Sensor https://github.com/xoseperez/Time ArduinoJson - https://github.com/me-no-dev/ESPAsyncTCP#e074eaac + ESPAsyncTCP ESPAsyncWebServer https://github.com/marvinroger/async-mqtt-client Embedis From 52a63b1849fb0d4acac68492fa71b10dba04c491 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Thu, 12 Jan 2017 20:42:52 +0100 Subject: [PATCH 07/15] Changes in file comment headers --- CHANGELOG.md | 8 ++++++++ code/espurna/button.ino | 1 - code/espurna/config/arduino.h | 4 ++-- code/espurna/config/version.h | 2 +- code/espurna/dht.ino | 1 - code/espurna/domoticz.ino | 1 - code/espurna/ds18b20.ino | 3 +-- code/espurna/emon.ino | 1 - code/espurna/fauxmo.ino | 3 +-- code/espurna/led.ino | 1 - code/espurna/mqtt.ino | 3 +-- code/espurna/nofuss.ino | 1 - code/espurna/ntp.ino | 1 - code/espurna/ota.ino | 1 - code/espurna/pow.ino | 1 - code/espurna/relay.ino | 1 - code/espurna/rf.ino | 1 - code/espurna/settings.ino | 1 - code/espurna/web.ino | 1 - code/espurna/wifi.ino | 1 - 20 files changed, 14 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5772eb7c..78074d82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,14 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## [Unreleased] +### Fixed +- #35 Fixed frequent MQTT connection drops after WIFI reconnect +- Defer wifi disconnection from web interface to allow request to return + +### Changed +- Move all Arduino IDE configuration values to their own file + ## [1.4.3] 2017-01-11 ### Fixed - #6 Using forked Time library to prevent conflict with Arduino Core for ESP8266 time.h file in windows machines diff --git a/code/espurna/button.ino b/code/espurna/button.ino index 5edc3b99..f48158b9 100644 --- a/code/espurna/button.ino +++ b/code/espurna/button.ino @@ -1,6 +1,5 @@ /* -ESPurna BUTTON MODULE Copyright (C) 2016-2017 by Xose Pérez diff --git a/code/espurna/config/arduino.h b/code/espurna/config/arduino.h index dd6eb88c..daec359e 100644 --- a/code/espurna/config/arduino.h +++ b/code/espurna/config/arduino.h @@ -1,6 +1,6 @@ //-------------------------------------------------------------------------------- -// This setting is normally provided by PlatformIO -// Uncomment the appropiate line to build from the Arduino IDE +// These settings are normally provided by PlatformIO +// Uncomment the appropiate line(s) to build from the Arduino IDE //-------------------------------------------------------------------------------- //-------------------------------------------------------------------------------- diff --git a/code/espurna/config/version.h b/code/espurna/config/version.h index d380d7b4..70a58974 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.4.3" +#define APP_VERSION "1.4.4" #define APP_AUTHOR "xose.perez@gmail.com" #define APP_WEBSITE "http://tinkerman.cat" diff --git a/code/espurna/dht.ino b/code/espurna/dht.ino index a556ae52..21e8f1f1 100644 --- a/code/espurna/dht.ino +++ b/code/espurna/dht.ino @@ -1,6 +1,5 @@ /* -ESPurna DHT MODULE Copyright (C) 2016-2017 by Xose Pérez diff --git a/code/espurna/domoticz.ino b/code/espurna/domoticz.ino index 0a5f0188..2bbbcf14 100644 --- a/code/espurna/domoticz.ino +++ b/code/espurna/domoticz.ino @@ -1,6 +1,5 @@ /* -ESPurna DOMOTICZ MODULE Copyright (C) 2016-2017 by Xose Pérez diff --git a/code/espurna/ds18b20.ino b/code/espurna/ds18b20.ino index 6c3cb311..adc95da2 100644 --- a/code/espurna/ds18b20.ino +++ b/code/espurna/ds18b20.ino @@ -1,7 +1,6 @@ /* -ESPurna -SD18B20 MODULE +DS18B20 MODULE Copyright (C) 2016-2017 by Xose Pérez diff --git a/code/espurna/emon.ino b/code/espurna/emon.ino index 8ffe46df..ecf28301 100644 --- a/code/espurna/emon.ino +++ b/code/espurna/emon.ino @@ -1,6 +1,5 @@ /* -ESPurna EMON MODULE Copyright (C) 2016-2017 by Xose Pérez diff --git a/code/espurna/fauxmo.ino b/code/espurna/fauxmo.ino index 531dc3e0..4450394f 100644 --- a/code/espurna/fauxmo.ino +++ b/code/espurna/fauxmo.ino @@ -1,7 +1,6 @@ /* -ESPurna -DHT MODULE +FAUXMO MODULE Copyright (C) 2016-2017 by Xose Pérez diff --git a/code/espurna/led.ino b/code/espurna/led.ino index b4549dfc..b8f9fbf1 100644 --- a/code/espurna/led.ino +++ b/code/espurna/led.ino @@ -1,6 +1,5 @@ /* -ESPurna LED MODULE Copyright (C) 2016-2017 by Xose Pérez diff --git a/code/espurna/mqtt.ino b/code/espurna/mqtt.ino index 945d045d..138b2a7f 100644 --- a/code/espurna/mqtt.ino +++ b/code/espurna/mqtt.ino @@ -1,6 +1,5 @@ /* -ESPurna MQTT MODULE Copyright (C) 2016-2017 by Xose Pérez @@ -94,7 +93,7 @@ void _mqttOnConnect(bool sessionPresent) { void _mqttOnDisconnect(AsyncMqttClientDisconnectReason reason) { - DEBUG_MSG("[MQTT] Disconnected\n"); + DEBUG_MSG("[MQTT] Disconnected!\n"); // Send disconnect event to subscribers for (unsigned char i = 0; i < _mqtt_callbacks.size(); i++) { diff --git a/code/espurna/nofuss.ino b/code/espurna/nofuss.ino index aa9ca360..97e4dd1f 100644 --- a/code/espurna/nofuss.ino +++ b/code/espurna/nofuss.ino @@ -1,6 +1,5 @@ /* -ESPurna NOFUSS MODULE Copyright (C) 2016-2017 by Xose Pérez diff --git a/code/espurna/ntp.ino b/code/espurna/ntp.ino index 97839bb9..0772ef20 100644 --- a/code/espurna/ntp.ino +++ b/code/espurna/ntp.ino @@ -1,6 +1,5 @@ /* -ESPURNA NTP MODULE Copyright (C) 2016-2017 by Xose Pérez diff --git a/code/espurna/ota.ino b/code/espurna/ota.ino index 1ba8dd4a..ff4137ce 100644 --- a/code/espurna/ota.ino +++ b/code/espurna/ota.ino @@ -1,6 +1,5 @@ /* -ESPurna OTA MODULE Copyright (C) 2016-2017 by Xose Pérez diff --git a/code/espurna/pow.ino b/code/espurna/pow.ino index 8aa5a4ea..f6865728 100644 --- a/code/espurna/pow.ino +++ b/code/espurna/pow.ino @@ -1,6 +1,5 @@ /* -ESPurna POW MODULE Support for Sonoff POW HLW8012-based power monitor diff --git a/code/espurna/relay.ino b/code/espurna/relay.ino index f2839447..356fc630 100644 --- a/code/espurna/relay.ino +++ b/code/espurna/relay.ino @@ -1,6 +1,5 @@ /* -ESPurna RELAY MODULE Copyright (C) 2016-2017 by Xose Pérez diff --git a/code/espurna/rf.ino b/code/espurna/rf.ino index fc32697d..0933ed83 100644 --- a/code/espurna/rf.ino +++ b/code/espurna/rf.ino @@ -1,6 +1,5 @@ /* -ESPurna RF MODULE Copyright (C) 2016-2017 by Xose Pérez diff --git a/code/espurna/settings.ino b/code/espurna/settings.ino index 7c643dd2..04463f48 100644 --- a/code/espurna/settings.ino +++ b/code/espurna/settings.ino @@ -1,6 +1,5 @@ /* -ESPurna SETTINGS MODULE Copyright (C) 2016-2017 by Xose Pérez diff --git a/code/espurna/web.ino b/code/espurna/web.ino index 4cf37b23..072ae3d1 100644 --- a/code/espurna/web.ino +++ b/code/espurna/web.ino @@ -1,6 +1,5 @@ /* -ESPurna WEBSERVER MODULE Copyright (C) 2016-2017 by Xose Pérez diff --git a/code/espurna/wifi.ino b/code/espurna/wifi.ino index 0db7a93b..9f65520d 100644 --- a/code/espurna/wifi.ino +++ b/code/espurna/wifi.ino @@ -1,6 +1,5 @@ /* -ESPurna WIFI MODULE Copyright (C) 2016-2017 by Xose Pérez From a098614ca64cb6e05816325947c5f02312675f1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Fri, 13 Jan 2017 11:27:50 +0100 Subject: [PATCH 08/15] Adding current, voltage, apparent and reactive power reports to Sonoff POW --- code/espurna/config/sensors.h | 10 +++- code/espurna/data/index.html.gz | Bin 3250 -> 3547 bytes code/espurna/data/script.js.gz | Bin 37874 -> 37889 bytes code/espurna/espurna.ino | 2 - code/espurna/pow.ino | 101 ++++++++++++++++++++++++-------- code/espurna/web.ino | 50 +++++++++++----- code/html/custom.js | 3 + code/html/index.html | 50 +++++++++++++++- code/platformio.ini | 4 +- 9 files changed, 173 insertions(+), 47 deletions(-) diff --git a/code/espurna/config/sensors.h b/code/espurna/config/sensors.h index 338a9913..18d67bc9 100644 --- a/code/espurna/config/sensors.h +++ b/code/espurna/config/sensors.h @@ -61,5 +61,11 @@ #define POW_VOLTAGE_R_UP ( 5 * 470000 ) // Real: 2280k #define POW_VOLTAGE_R_DOWN ( 1000 ) // Real 1.009k #define POW_POWER_TOPIC "/power" -#define POW_UPDATE_INTERVAL 10000 -#define POW_REPORT_EVERY 6 +#define POW_CURRENT_TOPIC "/current" +#define POW_VOLTAGE_TOPIC "/voltage" +#define POW_APOWER_TOPIC "/apower" +#define POW_RPOWER_TOPIC "/rpower" +#define POW_PFACTOR_TOPIC "/pfactor" +#define POW_ENERGY_TOPIC "/energy" +#define POW_UPDATE_INTERVAL 5000 +#define POW_REPORT_EVERY 12 diff --git a/code/espurna/data/index.html.gz b/code/espurna/data/index.html.gz index 2e18235ddda36ee699d17020c779c5483490db45..0f4ed80475d5713134ac395ef4e32060d9b5a39c 100644 GIT binary patch literal 3547 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 literal 3250 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 diff --git a/code/espurna/data/script.js.gz b/code/espurna/data/script.js.gz index 777cb0539f51a4d15e4e9b403012de077b7447b7..c85032e77d6fee678630a890a4b121411e412cfe 100644 GIT binary patch delta 36229 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 F0RUQTB?15d delta 36234 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 Ky*k4(t^ok;#4))5 diff --git a/code/espurna/espurna.ino b/code/espurna/espurna.ino index 0031b9dc..bca34abf 100644 --- a/code/espurna/espurna.ino +++ b/code/espurna/espurna.ino @@ -175,6 +175,4 @@ void loop() { powerMonitorLoop(); #endif - yield(); - } diff --git a/code/espurna/pow.ino b/code/espurna/pow.ino index f6865728..0b2d6910 100644 --- a/code/espurna/pow.ino +++ b/code/espurna/pow.ino @@ -11,6 +11,8 @@ Copyright (C) 2016-2017 by Xose Pérez #include +#define POW_USE_INTERRUPTS 1 + HLW8012 hlw8012; // ----------------------------------------------------------------------------- @@ -28,17 +30,19 @@ void hlw8012_cf_interrupt() { } void powAttachInterrupts() { - //attachInterrupt(POW_CF1_PIN, hlw8012_cf1_interrupt, CHANGE); + attachInterrupt(POW_CF1_PIN, hlw8012_cf1_interrupt, CHANGE); attachInterrupt(POW_CF_PIN, hlw8012_cf_interrupt, CHANGE); DEBUG_MSG("[POW] Enabled\n"); } void powDettachInterrupts() { - //detachInterrupt(POW_CF1_PIN); + detachInterrupt(POW_CF1_PIN); detachInterrupt(POW_CF_PIN); DEBUG_MSG("[POW] Disabled\n"); } +// ----------------------------------------------------------------------------- + void powSaveCalibration() { setSetting("powPowerMult", hlw8012.getPowerMultiplier()); setSetting("powCurrentMult", hlw8012.getCurrentMultiplier()); @@ -76,6 +80,13 @@ void powSetExpectedVoltage(unsigned int voltage) { } } +void powReset() { + hlw8012.resetMultipliers(); + powSaveCalibration(); +} + +// ----------------------------------------------------------------------------- + unsigned int getActivePower() { return hlw8012.getActivePower(); } @@ -84,6 +95,10 @@ unsigned int getApparentPower() { return hlw8012.getApparentPower(); } +unsigned int getReactivePower() { + return hlw8012.getReactivePower(); +} + double getCurrent() { return hlw8012.getCurrent(); } @@ -96,6 +111,8 @@ unsigned int getPowerFactor() { return (int) (100 * hlw8012.getPowerFactor()); } +// ----------------------------------------------------------------------------- + void powSetup() { // Initialize HLW8012 @@ -104,7 +121,11 @@ void powSetup() { // * currentWhen is the value in sel_pin to select current sampling // * set use_interrupts to true to use interrupts to monitor pulse widths // * leave pulse_timeout to the default value, recommended when using interrupts - hlw8012.begin(POW_CF_PIN, POW_CF1_PIN, POW_SEL_PIN, POW_SEL_CURRENT, false, 1000000); + #if POW_USE_INTERRUPTS + hlw8012.begin(POW_CF_PIN, POW_CF1_PIN, POW_SEL_PIN, POW_SEL_CURRENT, true); + #else + hlw8012.begin(POW_CF_PIN, POW_CF1_PIN, POW_SEL_PIN, POW_SEL_CURRENT, false, 1000000); + #endif // These values are used to calculate current, voltage and power factors as per datasheet formula // These are the nominal values for the Sonoff POW resistors: @@ -113,25 +134,13 @@ void powSetup() { // * The VOLTAGE_RESISTOR_DOWNSTREAM is the 1kOhm resistor in the voltage divider that feeds the V2P pin in the HLW8012 hlw8012.setResistors(POW_CURRENT_R, POW_VOLTAGE_R_UP, POW_VOLTAGE_R_DOWN); + // Retrieve calibration values powRetrieveCalibration(); - /* - static WiFiEventHandler e1 = WiFi.onStationModeDisconnected([](const WiFiEventStationModeDisconnected& event) { - powDettachInterrupts(); - }); - - static WiFiEventHandler e2 = WiFi.onSoftAPModeStationDisconnected([](const WiFiEventSoftAPModeStationDisconnected& event) { - powDettachInterrupts(); - }); - - static WiFiEventHandler e3 = WiFi.onStationModeConnected([](const WiFiEventStationModeConnected& event) { - powAttachInterrupts(); - }); - - static WiFiEventHandler e4 = WiFi.onSoftAPModeStationConnected([](const WiFiEventSoftAPModeStationConnected& event) { + // Attach interrupts + #if POW_USE_INTERRUPTS powAttachInterrupts(); - }); - */ + #endif } @@ -140,20 +149,66 @@ void powLoop() { static unsigned long last_update = 0; static unsigned char report_count = POW_REPORT_EVERY; + static unsigned long power_sum = 0; + static double current_sum = 0; + static unsigned long voltage_sum = 0; + if ((millis() - last_update > POW_UPDATE_INTERVAL) || (last_update == 0 )){ + last_update = millis(); unsigned int power = getActivePower(); - - char buffer[100]; - sprintf_P(buffer, PSTR("{\"powVisible\": 1, \"powActivePower\": %d}"), power); - wsSend(buffer); + unsigned int voltage = getVoltage(); + double current = getCurrent(); + unsigned int apparent = getApparentPower(); + unsigned int factor = getPowerFactor(); + unsigned int reactive = getReactivePower(); + + power_sum += power; + current_sum += current; + voltage_sum += voltage; + + DynamicJsonBuffer jsonBuffer; + JsonObject& root = jsonBuffer.createObject(); + + root["powVisible"] = 1; + root["powActivePower"] = power; + root["powCurrent"] = current; + root["powVoltage"] = voltage; + root["powApparentPower"] = apparent; + root["powReactivePower"] = reactive; + root["powPowerFactor"] = factor; + + String output; + root.printTo(output); + wsSend((char *) output.c_str()); if (--report_count == 0) { + + power = power_sum / POW_REPORT_EVERY; + current = current_sum / POW_REPORT_EVERY; + voltage = voltage_sum / POW_REPORT_EVERY; + apparent = current * voltage; + reactive = (apparent > power) ? sqrt(apparent * apparent - power * power) : 0; + factor = (apparent > 0) ? 100 * power / apparent : 100; + mqttSend(getSetting("powPowerTopic", POW_POWER_TOPIC).c_str(), String(power).c_str()); + mqttSend(getSetting("powCurrentTopic", POW_CURRENT_TOPIC).c_str(), String(current).c_str()); + mqttSend(getSetting("powVoltageTopic", POW_VOLTAGE_TOPIC).c_str(), String(voltage).c_str()); + mqttSend(getSetting("powAPowerTopic", POW_APOWER_TOPIC).c_str(), String(apparent).c_str()); + mqttSend(getSetting("powRPowerTopic", POW_RPOWER_TOPIC).c_str(), String(reactive).c_str()); + mqttSend(getSetting("powPFactorTopic", POW_PFACTOR_TOPIC).c_str(), String(factor).c_str()); + + power_sum = current_sum = voltage_sum = 0; report_count = POW_REPORT_EVERY; + } + // Toggle between current and voltage monitoring + #if POW_USE_INTERRUPTS == 0 + hlw8012.toggleMode(); + #endif + } } diff --git a/code/espurna/web.ino b/code/espurna/web.ino index 072ae3d1..d0aa13e6 100644 --- a/code/espurna/web.ino +++ b/code/espurna/web.ino @@ -80,7 +80,7 @@ void _wsParse(uint32_t client_id, uint8_t * payload, size_t length) { // Let the HTTP request return and disconnect after 100ms deferred.once_ms(100, wifiDisconnect); - + } if (action.equals("on")) relayStatus(relayID, true); if (action.equals("off")) relayStatus(relayID, false); @@ -93,8 +93,9 @@ void _wsParse(uint32_t client_id, uint8_t * payload, size_t length) { JsonArray& config = root["config"]; DEBUG_MSG("[WEBSOCKET] Parsing configuration data\n"); - bool dirty = false; - bool dirtyMQTT = false; + bool save = false; + bool changed = false; + bool changedMQTT = false; bool apiEnabled = false; #if ENABLE_FAUXMO bool fauxmoEnabled = false; @@ -112,15 +113,28 @@ void _wsParse(uint32_t client_id, uint8_t * payload, size_t length) { if (key == "powExpectedPower") { powSetExpectedActivePower(value.toInt()); - continue; + changed = true; } - #else + if (key == "powExpectedVoltage") { + powSetExpectedVoltage(value.toInt()); + changed = true; + } + + if (key == "powExpectedCurrent") { + powSetExpectedCurrent(value.toInt()); + changed = true; + } - if (key.startsWith("pow")) continue; + if (key == "powExpectedReset") { + powReset(); + changed = true; + } #endif + if (key.startsWith("pow")) continue; + #if ENABLE_DOMOTICZ if (key == "dczIdx") { @@ -185,8 +199,8 @@ 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; + save = changed = true; + if (key.startsWith("mqtt")) changedMQTT = true; } } @@ -194,12 +208,12 @@ void _wsParse(uint32_t client_id, uint8_t * payload, size_t length) { // Checkboxes if (apiEnabled != (getSetting("apiEnabled").toInt() == 1)) { setSetting("apiEnabled", apiEnabled); - dirty = true; + save = changed = true; } #if ENABLE_FAUXMO if (fauxmoEnabled != (getSetting("fauxmoEnabled").toInt() == 1)) { setSetting("fauxmoEnabled", fauxmoEnabled); - dirty = true; + save = changed = true; } #endif @@ -213,7 +227,7 @@ void _wsParse(uint32_t client_id, uint8_t * payload, size_t length) { } for (int i = network; i 0) { - dirty = true; + save = changed = true; } delSetting("ssid" + String(i)); delSetting("pass" + String(i)); @@ -224,7 +238,7 @@ void _wsParse(uint32_t client_id, uint8_t * payload, size_t length) { } // Save settings - if (dirty) { + if (save) { saveSettings(); wifiConfigure(); @@ -243,16 +257,15 @@ void _wsParse(uint32_t client_id, uint8_t * payload, size_t length) { #endif // Check if we should reconfigure MQTT connection - if (dirtyMQTT) { + if (changedMQTT) { mqttDisconnect(); } + } + if (changed) { ws.text(client_id, "{\"message\": \"Changes saved\"}"); - } else { - ws.text(client_id, "{\"message\": \"No changes detected\"}"); - } } @@ -345,6 +358,11 @@ void _wsStart(uint32_t client_id) { #if ENABLE_POW root["powVisible"] = 1; root["powActivePower"] = getActivePower(); + root["powApparentPower"] = getApparentPower(); + root["powReactivePower"] = getReactivePower(); + root["powVoltage"] = getVoltage(); + root["powCurrent"] = getCurrent(); + root["powPowerFactor"] = getPowerFactor(); #endif root["maxNetworks"] = WIFI_MAX_NETWORKS; diff --git a/code/html/custom.js b/code/html/custom.js index c6a2791a..cae8fc19 100644 --- a/code/html/custom.js +++ b/code/html/custom.js @@ -36,6 +36,9 @@ function doUpdate() { var data = $("#formSave").serializeArray(); websock.send(JSON.stringify({'config': data})); $(".powExpected").val(0); + $("input[name='powExpectedReset']") + .prop("checked", false) + .iphoneStyle("refresh"); } return false; } diff --git a/code/html/index.html b/code/html/index.html index ee8ab0c2..e7a7a5bc 100644 --- a/code/html/index.html +++ b/code/html/index.html @@ -136,10 +136,35 @@

+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
@@ -363,7 +388,28 @@
 
-
If you are using a pure resistive load like a bulb this will be writen on it, otherwise use a socket multimeter to get this value.
+
In Watts (W). If you are using a pure resistive load like a bulb this will be writen on it, otherwise use a socket multimeter to get this value.
+ + +
+ + +
 
+
In Volts (V). Enter your the nominal AC voltage for your household or facility, or use multimeter to get this value.
+
+ +
+ + +
 
+
In Ampers (A). If you are using a pure resistive load like a bulb this will the ratio between the two previous values, i.e. power / voltage. You can also use a current clamp around one fo the power wires to get this value.
+
+ +
+
+
+
 
+
Move this switch to ON and press "Update" to revert to factory values.
diff --git a/code/platformio.ini b/code/platformio.ini index b8044901..97c03780 100644 --- a/code/platformio.ini +++ b/code/platformio.ini @@ -17,7 +17,7 @@ lib_deps = OneWire DallasTemperature https://bitbucket.org/xoseperez/justwifi.git - HLW8012 + https://bitbucket.org/xoseperez/hlw8012.git https://bitbucket.org/xoseperez/fauxmoesp.git https://bitbucket.org/xoseperez/nofuss.git https://bitbucket.org/xoseperez/emonliteesp.git @@ -127,7 +127,7 @@ extra_script = pio_hooks.py build_flags = -g -Wl,-Tesp8266.flash.1m128.ld -DDEBUG_PORT=Serial -DSONOFF_POW upload_speed = 115200 upload_port = "192.168.4.1" -upload_flags = --auth=fibonacci --port 8266 +upload_flags = --auth=Algernon1 --port 8266 [env:sonoff-dual-debug] platform = espressif8266 From ff5ba3b0f545ed3d5f7ddc5d9041523fc8e9a461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Fri, 13 Jan 2017 11:32:50 +0100 Subject: [PATCH 09/15] Update changelog --- CHANGELOG.md | 6 +++++- README.md | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78074d82..57b4226e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,13 +3,17 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). -## [Unreleased] +## [1.4.4] 2017-01-13 +### Added +- Adding current, voltage, apparent and reactive power reports to Sonoff POW (Web & MQTT) + ### Fixed - #35 Fixed frequent MQTT connection drops after WIFI reconnect - Defer wifi disconnection from web interface to allow request to return ### Changed - Move all Arduino IDE configuration values to their own file +- Using latest HLW8012 library in interrupt mode ## [1.4.3] 2017-01-11 ### Fixed diff --git a/README.md b/README.md index 800d00d3..3983fc51 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ESPurna ("spark" in Catalan) is a custom firmware for ESP8266 based smart switch 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.4.3**, read the [changelog](CHANGELOG.md). +**Current Release Version is 1.4.4**, read the [changelog](CHANGELOG.md). ## Features From 77e887dc6ca13b29a943c96aa176fc5cc4fb7ef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Fri, 13 Jan 2017 12:46:05 +0100 Subject: [PATCH 10/15] Notify OTA updates to web clients and reload page after the update --- code/espurna/data/script.js.gz | Bin 37889 -> 37895 bytes code/espurna/ota.ino | 3 +++ code/espurna/pow.ino | 2 +- code/espurna/relay.ino | 2 +- code/espurna/web.ino | 14 ++++++-------- code/html/custom.js | 2 ++ 6 files changed, 13 insertions(+), 10 deletions(-) diff --git a/code/espurna/data/script.js.gz b/code/espurna/data/script.js.gz index c85032e77d6fee678630a890a4b121411e412cfe..168524e05d2feed717e2d3da40d11d9d878263ff 100644 GIT binary patch delta 33251 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
A+WlOV%jFB* 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°qxgH#4KRlT^^l%V;iI_E3JOKT$Ou-uMN>b|PxzAc%vE z5}WK8syRerE+lIhN2TmJ<}>B(Ma9MG&*#qXKzA{aP=L^?e?pnv2Be5J*kJ1b zDOqU`rr#Y)RHi`qxQGggKff9n&;pG8EO6kryAXWjD~tKV@ie2u!f20D*x;p6ebaLC zwiAj}=Dzgj-c4_JAi>^yF@G&B=5XS0*ef-DTEl;Hz3ZrY+1riFHj&sPm$3U-DF(k!OLd6ZZ%>Za;_ z()nPquwNuwwwSvbjw#>gWOW#NoXLY<*>7M1(TjTNRUbWke;8?l10+z2NkO z25@E^5aszRkKv`9^Xl?dv0P|5kM_ftkeDO$t&@s`mpC|(zvKD!rFo7cxr#-&_W^jW zRiT-lH#qj*{uNo(6`mh>YqqLS>uN!gTZnsXJ?b9tF~HpOgY2r3!1KB^_e%eM0~>SN zwJitU(~0;Hf7c>t&pB^To&J)X#Y;)C%yY;}r;Mf7U^zNDF}8@}TC;)<;-qew~l z{zb@8UDuZv{5cXl*mr>ogva%80b&E_b+W&GEBG5~^k4lk_n z!}lcdP}NDkJNNavERwx}SDx4nttp+oh_=9<{Pb1*e_Od+>RR%>=6z~PNOG?XS^#%? z$WmCk^Z4jSr7&}+gb4zKw^=x9aCFxx`g`2LwBGoKZ>RPZD>of0+|a7=kRVJDD%jcZ6;af6Eve?t4qa2cpT@V@LVy50QX%+19g{ z{9*Kmy`v`qhyi#0rX%)U<_cO_!9vse@8{>mk``I?`4Uf^;yI1DS5x|vvubbe^Yv<8 zJ<&O+(PC@C1sz78AMx9>>hmN1*lC`KlMI{X8i80XS>eD>)b`yifr z1&5m~SizkgI!kn*mzzrL?>H!tio}lEZ`$jtqA#`dG8<$oMZ5KYS+9%s24+6`0f9eY zFx{nTU8>k;H%wq0t1t?e7VD7BveNV>Xp>2gAQdQG6_r;-8CKD-EGKn%#Ge&#aho-h zevhp&lf~6xzh$F=E+j|7abRV=DlZGwaHOgR5j2`7$NYGV72Q1SWbDnY=rp(CapzBa r8IxR)8Uaa@caSOp<+GxYdIABIlO2;q0^JysWRsN$JQMD0maYK+5~odD delta 33263 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 D10N0c diff --git a/code/espurna/ota.ino b/code/espurna/ota.ino index ff4137ce..07f27c5d 100644 --- a/code/espurna/ota.ino +++ b/code/espurna/ota.ino @@ -24,10 +24,13 @@ void otaSetup() { ArduinoOTA.onStart([]() { DEBUG_MSG("[OTA] Start\n"); + wsSend("{\"message\": \"OTA update started\"}"); }); ArduinoOTA.onEnd([]() { DEBUG_MSG("\n[OTA] End\n"); + wsSend("{\"action\": \"reload\"}"); + delay(100); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { diff --git a/code/espurna/pow.ino b/code/espurna/pow.ino index 0b2d6910..c71c282c 100644 --- a/code/espurna/pow.ino +++ b/code/espurna/pow.ino @@ -181,7 +181,7 @@ void powLoop() { String output; root.printTo(output); - wsSend((char *) output.c_str()); + wsSend(output.c_str()); if (--report_count == 0) { diff --git a/code/espurna/relay.ino b/code/espurna/relay.ino index 356fc630..3a2c6b5f 100644 --- a/code/espurna/relay.ino +++ b/code/espurna/relay.ino @@ -52,7 +52,7 @@ String relayString() { void relayWS() { String output = relayString(); - wsSend((char *) output.c_str()); + wsSend(output.c_str()); } bool relayStatus(unsigned char id) { diff --git a/code/espurna/web.ino b/code/espurna/web.ino index d0aa13e6..41d085fb 100644 --- a/code/espurna/web.ino +++ b/code/espurna/web.ino @@ -30,24 +30,24 @@ Ticker deferred; // WEBSOCKETS // ----------------------------------------------------------------------------- -bool wsSend(char * payload) { - //DEBUG_MSG("[WEBSOCKET] Broadcasting '%s'\n", payload); +bool wsSend(const char * payload) { + DEBUG_MSG("[WEBSOCKET] Broadcasting '%s'\n", payload); ws.textAll(payload); } -bool wsSend(uint32_t client_id, char * payload) { - //DEBUG_MSG("[WEBSOCKET] Sending '%s' to #%ld\n", payload, client_id); +bool wsSend(uint32_t client_id, const char * payload) { + DEBUG_MSG("[WEBSOCKET] Sending '%s' to #%ld\n", payload, client_id); ws.text(client_id, payload); } void wsMQTTCallback(unsigned int type, const char * topic, const char * payload) { if (type == MQTT_CONNECT_EVENT) { - wsSend((char *) "{\"mqttStatus\": true}"); + wsSend("{\"mqttStatus\": true}"); } if (type == MQTT_DISCONNECT_EVENT) { - wsSend((char *) "{\"mqttStatus\": false}"); + wsSend("{\"mqttStatus\": false}"); } } @@ -564,8 +564,6 @@ ArRequestHandlerFunction _onRelayStatusWrapper(unsigned int relayID) { if (request->method() == HTTP_PUT) { if (request->hasParam("status", true)) { AsyncWebParameter* p = request->getParam("status", true); - wsSend((char *) String(relayID).c_str()); - wsSend((char *) p->value().c_str()); unsigned int value = p->value().toInt(); if (value == 2) { relayToggle(relayID); diff --git a/code/html/custom.js b/code/html/custom.js index cae8fc19..118c1ac7 100644 --- a/code/html/custom.js +++ b/code/html/custom.js @@ -207,6 +207,8 @@ function processData(data) { window.location = "/"; }); + } else { + window.location = "/"; } } From 8ad3c8708e74b9a47dc032a65e879a9ead4c7320 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Sat, 14 Jan 2017 00:16:24 +0100 Subject: [PATCH 11/15] Document fauxmo and domoticz default settings --- code/espurna/config/arduino.h | 17 +++++++++-------- code/espurna/config/general.h | 9 ++++++++- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/code/espurna/config/arduino.h b/code/espurna/config/arduino.h index daec359e..d8bb52d2 100644 --- a/code/espurna/config/arduino.h +++ b/code/espurna/config/arduino.h @@ -28,13 +28,14 @@ //#define ESPURNA //-------------------------------------------------------------------------------- -// Features +// Features (values below are default values) //-------------------------------------------------------------------------------- -//#define ENABLE_DHT 1 -//#define ENABLE_DS18B20 1 -//#define ENABLE_EMON 1 -//#define ENABLE_HLW8018 1 -//#define ENABLE_RF 1 -//#define ENABLE_FAUXMO 0 -//#define ENABLE_NOFUSS 1 +//#define ENABLE_DHT 0 +//#define ENABLE_DS18B20 0 +//#define ENABLE_EMON 0 +//#define ENABLE_HLW8018 0 +//#define ENABLE_RF 0 +//#define ENABLE_FAUXMO 1 +//#define ENABLE_NOFUSS 0 +//#define ENABLE_DOMOTICZ 1 diff --git a/code/espurna/config/general.h b/code/espurna/config/general.h index 399f8867..1119dc9f 100644 --- a/code/espurna/config/general.h +++ b/code/espurna/config/general.h @@ -89,7 +89,9 @@ // DOMOTICZ // ----------------------------------------------------------------------------- -#define ENABLE_DOMOTICZ 1 +#ifndef ENABLE_DOMOTICZ + #define ENABLE_DOMOTICZ 1 +#endif #define DOMOTICZ_IN_TOPIC "domoticz/in" #define DOMOTICZ_OUT_TOPIC "domoticz/out" @@ -106,7 +108,12 @@ // FAUXO // ----------------------------------------------------------------------------- +// This setting defines whether Alexa support should be built into the firmware #ifndef ENABLE_FAUXMO #define ENABLE_FAUXMO 1 #endif + +// This is default value for the fauxmoEnabled setting that defines whether +// this device should be discoberable and respond to Alexa commands. +// Both ENABLE_FAUXMO and fauxmoEnabled should be 1 for Alexa support to work. #define FAUXMO_ENABLED 1 From e4ea3b0f6643f77c880a51563c9614c516a001f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Tue, 17 Jan 2017 16:13:30 +0100 Subject: [PATCH 12/15] Small fixes, mostly comments and debug --- code/espurna/config/general.h | 2 +- code/espurna/espurna.ino | 1 + code/espurna/mqtt.ino | 3 ++- code/espurna/pow.ino | 1 + code/gulpfile.js | 2 +- code/html/index.html | 2 +- 6 files changed, 7 insertions(+), 4 deletions(-) diff --git a/code/espurna/config/general.h b/code/espurna/config/general.h index 1119dc9f..984254bd 100644 --- a/code/espurna/config/general.h +++ b/code/espurna/config/general.h @@ -105,7 +105,7 @@ #define NTP_UPDATE_INTERVAL 1800 // ----------------------------------------------------------------------------- -// FAUXO +// FAUXMO // ----------------------------------------------------------------------------- // This setting defines whether Alexa support should be built into the firmware diff --git a/code/espurna/espurna.ino b/code/espurna/espurna.ino index bca34abf..3fca7dd0 100644 --- a/code/espurna/espurna.ino +++ b/code/espurna/espurna.ino @@ -1,6 +1,7 @@ /* ESPurna + Copyright (C) 2016-2017 by Xose Pérez This program is free software: you can redistribute it and/or modify diff --git a/code/espurna/mqtt.ino b/code/espurna/mqtt.ino index 138b2a7f..b0302d55 100644 --- a/code/espurna/mqtt.ino +++ b/code/espurna/mqtt.ino @@ -42,7 +42,7 @@ unsigned int mqttTopicRootLength() { void mqttSendRaw(const char * topic, const char * message) { if (mqtt.connected()) { - DEBUG_MSG("[MQTT] Sending %s %s\n", topic, message); + DEBUG_MSG("[MQTT] Sending %s => %s\n", topic, message); mqtt.publish(topic, MQTT_QOS, MQTT_RETAIN, message); } } @@ -141,6 +141,7 @@ void mqttConnect() { DEBUG_MSG("[MQTT] Connecting to broker at %s", host); mqtt.setServer(host, port); mqtt.setKeepAlive(MQTT_KEEPALIVE).setCleanSession(false); + mqtt.setWill(MQTT_HEARTBEAT_TOPIC, MQTT_QOS, MQTT_RETAIN, "0"); if ((strlen(user) > 0) && (strlen(pass) > 0)) { DEBUG_MSG(" as user '%s'.", user); mqtt.setCredentials(user, pass); diff --git a/code/espurna/pow.ino b/code/espurna/pow.ino index c71c282c..327ad08f 100644 --- a/code/espurna/pow.ino +++ b/code/espurna/pow.ino @@ -191,6 +191,7 @@ void powLoop() { apparent = current * voltage; reactive = (apparent > power) ? sqrt(apparent * apparent - power * power) : 0; factor = (apparent > 0) ? 100 * power / apparent : 100; + if (factor > 100) factor = 100; mqttSend(getSetting("powPowerTopic", POW_POWER_TOPIC).c_str(), String(power).c_str()); mqttSend(getSetting("powCurrentTopic", POW_CURRENT_TOPIC).c_str(), String(current).c_str()); diff --git a/code/gulpfile.js b/code/gulpfile.js index 1bf02633..35279c9f 100644 --- a/code/gulpfile.js +++ b/code/gulpfile.js @@ -2,7 +2,7 @@ ESP8266 file system builder -Copyright (C) 2016 by Xose PĆ©rez +Copyright (C) 2016 by Xose Pérez This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/code/html/index.html b/code/html/index.html index e7a7a5bc..7c0736d4 100644 --- a/code/html/index.html +++ b/code/html/index.html @@ -222,7 +222,7 @@
-
+
From 9e9ca87e626469541d15769ddb8974b6f18b9778 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Wed, 18 Jan 2017 02:48:41 +0100 Subject: [PATCH 13/15] Change LED pattern to make it less intrussive --- code/espurna/led.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/espurna/led.ino b/code/espurna/led.ino index b8f9fbf1..630a5790 100644 --- a/code/espurna/led.ino +++ b/code/espurna/led.ino @@ -49,9 +49,9 @@ void ledBlink(unsigned char id, unsigned long delayOff, unsigned long delayOn) { void showStatus() { if (wifiConnected()) { if (WiFi.getMode() == WIFI_AP) { - ledBlink(0, 2000, 2000); + ledBlink(0, 2500, 2500); } else { - ledBlink(0, 5000, 500); + ledBlink(0, 4900, 100); } } else { ledBlink(0, 500, 500); From 32bb6c45c7c27f0133270ac808e2f356d8bacdaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Wed, 18 Jan 2017 02:49:31 +0100 Subject: [PATCH 14/15] Map buttons to relays, send MQTT messages on button events --- code/espurna/button.ino | 55 ++++++++++++++++++++++++++++------ code/espurna/config/general.h | 1 + code/espurna/config/hardware.h | 16 ++++++++++ 3 files changed, 63 insertions(+), 9 deletions(-) diff --git a/code/espurna/button.ino b/code/espurna/button.ino index f48158b9..81720806 100644 --- a/code/espurna/button.ino +++ b/code/espurna/button.ino @@ -12,6 +12,16 @@ Copyright (C) 2016-2017 by Xose Pérez #ifdef SONOFF_DUAL +#ifdef MQTT_BUTTON_TOPIC +void buttonMQTT(unsigned char id) { + String mqttGetter = getSetting("mqttGetter", MQTT_USE_GETTER); + char buffer[strlen(MQTT_BUTTON_TOPIC) + mqttGetter.length() + 3]; + sprintf(buffer, "%s/%d%s", MQTT_BUTTON_TOPIC, id, mqttGetter.c_str()); + mqttSend(buffer, 1); + mqttSend(buffer, 0); +} +#endif + void buttonSetup() {} void buttonLoop() { @@ -29,7 +39,12 @@ void buttonLoop() { // Since we are not passing back RELAY2 value // (in the relayStatus method) it will only be present // here if it has actually been pressed - if ((value & 4) == 4) value = value ^ 1; + if ((value & 4) == 4) { + value = value ^ 1; + #ifdef MQTT_BUTTON_TOPIC + buttonMQTT(0); + #endif + } // Otherwise check if any of the other two BUTTONs // (in the header) has been pressent, but we should @@ -59,21 +74,36 @@ void buttonLoop() { #include #include -std::vector _buttons; +typedef struct { + DebounceEvent * button; + unsigned int relayID; +} button_t; + +std::vector _buttons; + +#ifdef MQTT_BUTTON_TOPIC +void buttonMQTT(unsigned char id) { + if (id >= _buttons.size()) return; + String mqttGetter = getSetting("mqttGetter", MQTT_USE_GETTER); + char buffer[strlen(MQTT_BUTTON_TOPIC) + mqttGetter.length() + 3]; + sprintf(buffer, "%s/%d%s", MQTT_BUTTON_TOPIC, id, mqttGetter.c_str()); + mqttSend(buffer, _buttons[id].button->pressed() ? "1" : "0"); +} +#endif void buttonSetup() { #ifdef BUTTON1_PIN - _buttons.push_back(new DebounceEvent(BUTTON1_PIN)); + _buttons.push_back({new DebounceEvent(BUTTON1_PIN), BUTTON1_RELAY}); #endif #ifdef BUTTON2_PIN - _buttons.push_back(new DebounceEvent(BUTTON2_PIN)); + _buttons.push_back({new DebounceEvent(BUTTON2_PIN), BUTTON2_RELAY}); #endif #ifdef BUTTON3_PIN - _buttons.push_back(new DebounceEvent(BUTTON3_PIN)); + _buttons.push_back({new DebounceEvent(BUTTON3_PIN), BUTTON3_RELAY}); #endif #ifdef BUTTON4_PIN - _buttons.push_back(new DebounceEvent(BUTTON4_PIN)); + _buttons.push_back({new DebounceEvent(BUTTON4_PIN), BUTTON4_RELAY}); #endif DEBUG_MSG("[BUTTON] Number of buttons: %d\n", _buttons.size()); @@ -83,14 +113,21 @@ void buttonSetup() { void buttonLoop() { for (unsigned int i=0; i < _buttons.size(); i++) { - if (_buttons[i]->loop()) { - uint8_t event = _buttons[i]->getEvent(); + if (_buttons[i].button->loop()) { + uint8_t event = _buttons[i].button->getEvent(); DEBUG_MSG("[BUTTON] Pressed #%d, event: %d\n", i, event); + #ifdef MQTT_BUTTON_TOPIC + buttonMQTT(i); + #endif if (i == 0) { if (event == EVENT_DOUBLE_CLICK) createAP(); if (event == EVENT_LONG_CLICK) ESP.reset(); } - if (event == EVENT_SINGLE_CLICK) relayToggle(i); + if (event == EVENT_SINGLE_CLICK) { + if (_buttons[i].relayID > 0) { + relayToggle(_buttons[i].relayID - 1); + } + } } } diff --git a/code/espurna/config/general.h b/code/espurna/config/general.h index 984254bd..3032f5d8 100644 --- a/code/espurna/config/general.h +++ b/code/espurna/config/general.h @@ -70,6 +70,7 @@ #define MQTT_SKIP_TIME 1000 #define MQTT_RELAY_TOPIC "/relay" #define MQTT_LED_TOPIC "/led" +#define MQTT_BUTTON_TOPIC "/button" #define MQTT_IP_TOPIC "/ip" #define MQTT_VERSION_TOPIC "/version" #define MQTT_FSVERSION_TOPIC "/fsversion" diff --git a/code/espurna/config/hardware.h b/code/espurna/config/hardware.h index 1616de35..35247368 100644 --- a/code/espurna/config/hardware.h +++ b/code/espurna/config/hardware.h @@ -7,6 +7,7 @@ #define MANUFACTURER "NODEMCU" #define DEVICE "LOLIN" #define BUTTON1_PIN 0 + #define BUTTON1_RELAY 1 #define RELAY1_PIN 12 #define RELAY1_PIN_INVERSE 0 #define LED1_PIN 2 @@ -30,6 +31,7 @@ #define MANUFACTURER "ITEAD" #define DEVICE "SONOFF" #define BUTTON1_PIN 0 + #define BUTTON1_RELAY 1 #define RELAY1_PIN 12 #define RELAY1_PIN_INVERSE 0 #define LED1_PIN 13 @@ -40,6 +42,7 @@ #define MANUFACTURER "ITEAD" #define DEVICE "SONOFF_TH" #define BUTTON1_PIN 0 + #define BUTTON1_RELAY 1 #define RELAY1_PIN 12 #define RELAY1_PIN_INVERSE 0 #define LED1_PIN 13 @@ -50,6 +53,7 @@ #define MANUFACTURER "ITEAD" #define DEVICE "SONOFF_SV" #define BUTTON1_PIN 0 + #define BUTTON1_RELAY 1 #define RELAY1_PIN 12 #define RELAY1_PIN_INVERSE 0 #define LED1_PIN 13 @@ -60,6 +64,7 @@ #define MANUFACTURER "ITEAD" #define DEVICE "SLAMPHER" #define BUTTON1_PIN 0 + #define BUTTON1_RELAY 1 #define RELAY1_PIN 12 #define RELAY1_PIN_INVERSE 0 #define LED1_PIN 13 @@ -70,6 +75,7 @@ #define MANUFACTURER "ITEAD" #define DEVICE "S20" #define BUTTON1_PIN 0 + #define BUTTON1_RELAY 1 #define RELAY1_PIN 12 #define RELAY1_PIN_INVERSE 0 #define LED1_PIN 13 @@ -80,6 +86,7 @@ #define MANUFACTURER "ITEAD" #define DEVICE "SONOFF_TOUCH" #define BUTTON1_PIN 0 + #define BUTTON1_RELAY 1 #define RELAY1_PIN 12 #define RELAY1_PIN_INVERSE 0 #define LED1_PIN 13 @@ -90,6 +97,7 @@ #define MANUFACTURER "ITEAD" #define DEVICE "SONOFF_POW" #define BUTTON1_PIN 0 + #define BUTTON1_RELAY 1 #define RELAY1_PIN 12 #define RELAY1_PIN_INVERSE 0 #define LED1_PIN 15 @@ -111,9 +119,13 @@ #define MANUFACTURER "ITEAD" #define DEVICE "SONOFF_4CH" #define BUTTON1_PIN 0 + #define BUTTON1_RELAY 1 #define BUTTON2_PIN 9 + #define BUTTON2_RELAY 2 #define BUTTON3_PIN 10 + #define BUTTON3_RELAY 3 #define BUTTON4_PIN 14 + #define BUTTON4_RELAY 4 #define RELAY1_PIN 12 #define RELAY1_PIN_INVERSE 0 #define RELAY2_PIN 5 @@ -134,7 +146,9 @@ #define MANUFACTURER "ELECTRODRAGON" #define DEVICE "ESP_RELAY_BOARD" #define BUTTON1_PIN 0 + #define BUTTON1_RELAY 1 #define BUTTON2_PIN 2 + #define BUTTON2_RELAY 2 #define RELAY1_PIN 12 #define RELAY1_PIN_INVERSE 0 #define RELAY2_PIN 13 @@ -151,6 +165,7 @@ #define MANUFACTURER "WORKCHOICE" #define DEVICE "ECOPLUG" #define BUTTON1_PIN 13 + #define BUTTON1_RELAY 1 #define RELAY1_PIN 15 #define RELAY1_PIN_INVERSE 0 #define LED1_PIN 2 @@ -165,6 +180,7 @@ #define MANUFACTURER "TINKERMAN" #define DEVICE "ESPURNA" #define BUTTON1_PIN 0 + #define BUTTON1_RELAY 1 #define RELAY1_PIN 12 #define RELAY1_PIN_INVERSE 0 #define LED1_PIN 13 From fc20d62643e39e75cf9a13344133cf2d4cd9ddf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Fri, 20 Jan 2017 14:17:41 +0100 Subject: [PATCH 15/15] Added support for JanGoe Wifi Relay boards --- README.md | 1 + code/espurna/config/arduino.h | 2 ++ code/espurna/config/hardware.h | 30 +++++++++++++++++++++++++++ code/platformio.ini | 21 +++++++++++++++++++ images/devices/jangoe-wifi-relay.png | Bin 0 -> 32956 bytes 5 files changed, 54 insertions(+) create mode 100644 images/devices/jangoe-wifi-relay.png diff --git a/README.md b/README.md index 3983fc51..d60fb6d5 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,7 @@ For more information please refer to the [ESPurna Wiki](https://bitbucket.org/xo |![IteadStudio Sonoff Dual](images/devices/sonoff-dual.jpg) **IteadStudio Sonoff Dual**|![IteadStudio Sonoff POW](images/devices/sonoff-pow.jpg) **IteadStudio Sonoff POW**|![IteadStudio Sonoff TH10/TH16](images/devices/sonoff-th10-th16.jpg) **IteadStudio Sonoff TH10/TH16**| |![IteadStudio Sonoff RF](images/devices/sonoff-rf.jpg) **IteadStudio Sonoff RF**|![IteadStudio Sonoff SV](images/devices/sonoff-sv.jpg) **IteadStudio Sonoff SV**|![IteadStudio Sonoff Touch](images/devices/sonoff-touch.jpg) **IteadStudio Sonoff Touch**| |![Wemos D1 Mini Relay Shield](images/devices/d1mini.jpg) **Wemos D1 Mini Relay Shield**|![Electrodragon Relay Board](images/devices/electrodragon-relay-board.jpg) **Electrodragon Relay Board**|![WorkChoice EcoPlug](images/devices/workchoice-ecoplug.jpg) **WorkChoice EcoPlug**| +|![JanGoe Wifi Relay (NO/NC)](images/devices/jangoe-wifi-relay.png) **JanGoe Wifi Relay (NO/NC)**||| ## License diff --git a/code/espurna/config/arduino.h b/code/espurna/config/arduino.h index d8bb52d2..340029f6 100644 --- a/code/espurna/config/arduino.h +++ b/code/espurna/config/arduino.h @@ -25,6 +25,8 @@ //#define SONOFF_4CH //#define ESP_RELAY_BOARD //#define ECOPLUG +//#define WIFI_RELAY_NC +//#define WIFI_RELAY_NO //#define ESPURNA //-------------------------------------------------------------------------------- diff --git a/code/espurna/config/hardware.h b/code/espurna/config/hardware.h index 35247368..5dead08f 100644 --- a/code/espurna/config/hardware.h +++ b/code/espurna/config/hardware.h @@ -171,6 +171,36 @@ #define LED1_PIN 2 #define LED1_PIN_INVERSE 0 +// ----------------------------------------------------------------------------- +// JanGoe Wifi Relay (https://github.com/JanGoe/esp8266-wifi-relay) +// ----------------------------------------------------------------------------- + +#elif defined(WIFI_RELAY_NC) + + #define MANUFACTURER "JANGOE" + #define DEVICE "WIFI_RELAY_NC" + #define BUTTON1_PIN 12 + #define BUTTON1_RELAY 1 + #define BUTTON2_PIN 13 + #define BUTTON2_RELAY 2 + #define RELAY1_PIN 2 + #define RELAY1_PIN_INVERSE 1 + #define RELAY2_PIN 14 + #define RELAY2_PIN_INVERSE 1 + +#elif defined(WIFI_RELAY_NO) + + #define MANUFACTURER "JANGOE" + #define DEVICE "WIFI_RELAY_NO" + #define BUTTON1_PIN 12 + #define BUTTON1_RELAY 1 + #define BUTTON2_PIN 13 + #define BUTTON2_RELAY 2 + #define RELAY1_PIN 2 + #define RELAY1_PIN_INVERSE 0 + #define RELAY2_PIN 14 + #define RELAY2_PIN_INVERSE 0 + // ----------------------------------------------------------------------------- // ESPurna board (still beta) // ----------------------------------------------------------------------------- diff --git a/code/platformio.ini b/code/platformio.ini index 97c03780..634b0a9d 100644 --- a/code/platformio.ini +++ b/code/platformio.ini @@ -254,3 +254,24 @@ build_flags = -g -Wl,-Tesp8266.flash.1m128.ld -DDEBUG_PORT=Serial -DECOPLUG upload_speed = 115200 upload_port = "192.168.4.1" upload_flags = --auth=fibonacci --port 8266 + +[env:jangoe-debug] +platform = espressif8266 +framework = arduino +board = esp01_1m +lib_deps = ${common.lib_deps} +lib_ignore = ${common.lib_ignore} +extra_script = pio_hooks.py +build_flags = -g -DDEBUG_PORT=Serial -DWIFI_RELAY_NC + +[env:jangoe-debug-ota] +platform = espressif8266 +framework = arduino +board = esp01_1m +lib_deps = ${common.lib_deps} +lib_ignore = ${common.lib_ignore} +extra_script = pio_hooks.py +build_flags = -g -DDEBUG_PORT=Serial -DWIFI_RELAY_NC +upload_speed = 115200 +upload_port = "192.168.4.1" +upload_flags = --auth=fibonacci --port 8266 diff --git a/images/devices/jangoe-wifi-relay.png b/images/devices/jangoe-wifi-relay.png new file mode 100644 index 0000000000000000000000000000000000000000..271b6c7de35312678bb06620475a156f9e1c16be GIT binary patch literal 32956 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
!#; zS(r5Zcm@a0URKWy!UGtX`a>6T2|xrD^SL+d)! z{wO5(Hi?ulR)$S3rP@k%|J`qN#w1PP9Gg{Gh7Eq?GAqmNU-EGe;w$ueT7y6HxKkV3 zGK+J7Pk;-J*GLF^F~F#Lpg#JKnuWj=99?=J7Q)=2OuCl%p)ibdlfCK0HkskaQF!e7!%z1u6Ouus;NcsOBB_m@ySJBu@DK%uASmUOm_t zRMa1Z>v;9jv?LZaazv7MF$im3Ow#+feGxorc3X|=QGMp<7?7`Z;0 zZ-FHQ4sB!EK4s5JG`hR=Ts@!SPO2AgIHBp;hj)6SG&x>No!7(xzyuVl=(dm2f>vhmIHm^LHSXPs| zJ>tjfE;)9XHYdqYiagt5y5##u3H{zDse)x#lVO}!|)hRdjYA9&MW^Z>4f&d@(4_Wkr&(k+m6GY?%LyBGRW~e1lk4#ThZ0RU_O|C|&#O&TgxUff5-YO~)u!}B` z9=PjpEw})VF2kb8)_^gTkMFa9e5U`3FEsBwR6n_t=m0Fa7*?|q#Vvm%_?L?K+CT(_ zD{lSJvdhi1GwMP}7OJJmXwK`buJL!k$Sp8(OYHgLR$z6K-~k+sh`aa^4R3nj=VaR* z-p!FoacCY0CGV0BelKmmg6Jq#)hSR7J~Ia$0(kyQ3+dQMl=<*T@RezhcM^=esJoN) zg#hUJ@Vg7aQA186zOiR zU(?yDu~>fX38wfYA%Op0v^iBs-%d3dIvjWLjrXD+xk46VV_vEblFI6>2Zz>7_NyNof zwUtkt2t#HpC@?aCo-yNoYN9noCX+z%*}5LnQziwVV@&N*Mi& zvak?L?)$@w)v&X*K-9A)|B&!rx9KG!!+t4ON=B{+e#9t9$(WtQcvWpVy@#nsJppxi zc$oQLsz4Jl!o(P=KH-zV5cWe5y=u{ z$TFAnL-mJpLetjSu7(i=hLw?~I+hn^sSsed*A6w_!^4J3&)&WzqoCEgs~mGSc5EsQ z%~78>F)Y}SM`Xpd?7#%Sx!JW7ETM+~;xv@*>(o{Hl3hT1i7s(mP?46c*vjcL6PQ7k0L-qw*@xkmsaKde@%p4KA%_%(Mi@s?~N-`zsh(egMGHP?{Rj(zrR~_ts3;?tPN( zO2!eH3BZR=VVKWH*wk{eo-H5XJpL$)Niv6ky~+yQo+iomKFe~-qGaV%1+NhsMnMsOe8T_g+veX}xWq(h=WZa#>lzugiTA{qiRI2Rv zz>@W^T6uFV!l{=kme$&}tW;Crq~4mezg+Aki3jR+)cOE^xX+XUOU`px)J{ zi}WToc>k)o{`gtj5w_~(Ks@QUg^Uq;@^Jn1nhDCMk+ujJjMO$K5)7tvS-RDn7NB? zUa8`0Si+$Gol(PMZq98YJNs?TI^tLV0RQn0HSu9)F2*yr2x)_$L`%I3X4^ha{ANU6 z=B!o>R1nUnv;dD*r(2IN|6waw1b|%%*h3Vb&n*L@Xu2671pG#BD(h=f*td;Pl0!&{ z%9t==7KJ%~u|x&gkQZQ@N5@`r&{{mpTq)!!@9ao<6|+rbjg|@W!5F4O2#m>_@K0zq zdzM0BMM#w!%!?=W>11ky%p;&RIrKTiVL^OdrH!c)hu{kXwWAbmm4Sd>MTxg1+%^%i zzre2&dhL$>VRzHma19qc%EBYw{0y#AmZ5iVn6j`a1ghlo)|idG8Vn=e+LCLkkQy3(ZQf(!T>R+0d#2)9t%^ zW)Tg`AwE4L7Qev-z8D{9PI=%y7-pYhrsq&@uZhyOIKjR$P~g| zv@V3W*hCwzTx&Hncnos?l+(MGEjl!>ovy6x^nSzr`hd$_fkFS-5aofy5!Jl=2SqWb z@5MWeSWMTxh(T&eV^n`W&)IcKehexi`wECF9grWZTP;)Q`_sb^sVRI{D)&X-uzR{Fhz--Ccp{!<5egOe+u*aX?=rlUad!oh9(uveJS z>(dd~ZnRV5%pXwM-L`Aat+cwIE3EV7QmkYPjuS&aWM}%M1dkt^O8pvRv z3W7F#Q!q9@2qV%Z9Psw}+1Y16fDBp}y|EkO)e`)c(`&4fI3ctQ;58qPH!+S(GpsR$ zy15Fq-TaEGY&HhSVx6bi3TOwHxZ!jooc>;G-Azx_2h&-Hh>&4XrpWCu!E4d=NF7+o z?*C7&+D*IvkI%-o>u!;&2MR2dc)y(kSmdu>E3aQ)Bm$KPoAXn-Z!ssV3{oqF&I=w& z=yhz$u8GTvKl&oyA+L{?_EMHS89&9Dy%2$=B7|UsrermbyGV_St}{= zMq|Oa2P9xGLuqU3zr)VkB>RKmFM{x^&up|ufO-RfT@ZbFY<3rfCDxc)uVKeORi|f1 z4BeX{fLXR8N-gQ06SVh}3yJsxRW&N-)t7%s53NYJJg^@uRg}?~@y}eYJS}cNAx!S^ zCQQ)3bYf4(teK1k6K=x9?zDUP?xzLlJegOzqfXQ@`?we)>RF^-^u%NtBo|H8G>hAd z@vSV)u83{pkDEZ+dr{V;N5j_RN8Q>L>$$1cop^H}l*DK8mxivs;+b!`tQKa`?gPFFg(E z79^n|z2hbqild3LWc=3%VHk5NaMpyGZa8EBb@-Q(8rDaLsq=OjjHA~)u{IB`SwU8spLYkN9uMs@OFqdw3)C7Vi`)62U_veB%q2g+n$8FJ z{1SVE6EThOP?FQbnCt1*mDF{VRWm|)c1-tMyT0vP97Ehe?fivzpWF0gsn6Mh2+#|% zGBDQEVPT}_W@F>z1}2d775QiBtg{tw^SM2wyjO&@iyT84Ji#F<)2VHdZ(4gWSxutvZl!E6P%)Ptt~T#A6@e0h662&2Ea9b5byL78>Z z51NEsNWZ$nEHnD6^GI&;5|Zn=RE)BX!@r zVr&FmVF1s^Q4F+hC&L@V8SRXL5UalKn@k&;jeVT=yU;Vz{`O(KO^^6Rc zzylpydo=oeRVRR6{5K99i7dKMM&wH`fM_&e?m`$s+;wV_^_tmG>7EouS5ng8O3L%( zF5alO-|qW8Udry~^l@to>s*n2oHAMd|GNVjy!s2FGAnnl#GHZsYcdjw;x(eiLH`3z Cr#xQ( literal 0 HcmV?d00001