Skip to content

Commit f6c8c83

Browse files
authored
Merge pull request #84 from OpenEVSE/emoncms_config_feedback
Immediately post to the EmonCMS server when config changes.
2 parents 13b1a6e + cf92632 commit f6c8c83

File tree

10 files changed

+52
-13
lines changed

10 files changed

+52
-13
lines changed

gui

platformio.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ version = -DBUILD_TAG=3.2.0
3434
monitor_speed = 115200
3535
lib_deps =
3636
37-
37+
3838
3939
4040

src/app_config.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#include "divert.h"
44
#include "mqtt.h"
55
#include "tesla_client.h"
6+
#include "emoncms.h"
7+
#include "input.h"
68

79
#include "app_config.h"
810
#include "app_config_mqtt.h"
@@ -173,8 +175,13 @@ void config_changed(String name)
173175
if(mqtt_connected() != config_mqtt_enabled()) {
174176
mqtt_restart();
175177
}
178+
if(emoncms_connected != config_emoncms_enabled()) {
179+
emoncms_updated = true;
180+
}
176181
} else if(name.startsWith("mqtt_")) {
177182
mqtt_restart();
183+
} else if(name.startsWith("emoncms_")) {
184+
emoncms_updated = true;
178185
} else if(name == "divert_enabled" || name == "charge_mode") {
179186
DBUGVAR(config_divert_enabled());
180187
DBUGVAR(config_charge_mode());

src/emoncms.cpp

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@
1111
#include "emoncms.h"
1212
#include "app_config.h"
1313
#include "input.h"
14+
#include "event.h"
1415

1516
boolean emoncms_connected = false;
17+
boolean emoncms_updated = false;
1618

1719
unsigned long packets_sent = 0;
1820
unsigned long packets_success = 0;
@@ -21,11 +23,21 @@ const char *post_path = "/input/post?";
2123

2224
static MongooseHttpClient client;
2325

26+
static void emoncms_result(bool success, String message)
27+
{
28+
StaticJsonDocument<128> event;
29+
30+
emoncms_connected = success;
31+
event["emoncms_connected"] = (int)emoncms_connected;
32+
event["emoncms_message"] = message.substring(0, 64);
33+
event_send(event);
34+
}
35+
2436
void emoncms_publish(JsonDocument &data)
2537
{
2638
Profile_Start(emoncms_publish);
2739

28-
if (emoncms_apikey != 0)
40+
if (config_emoncms_enabled() && emoncms_apikey != 0)
2941
{
3042
String url = emoncms_server + post_path;
3143
String json;
@@ -47,23 +59,33 @@ void emoncms_publish(JsonDocument &data)
4759
MongooseString result = response->body();
4860
DBUGF("result = %.*s", result.length(), result.c_str());
4961

50-
StaticJsonDocument<32> doc;
62+
const size_t capacity = JSON_OBJECT_SIZE(2) + result.length();
63+
DynamicJsonDocument doc(capacity);
5164
if(DeserializationError::Code::Ok == deserializeJson(doc, result.c_str(), result.length()))
5265
{
66+
DBUGLN("Got JSON");
5367
bool success = doc["success"]; // true
5468
if(success) {
5569
packets_success++;
56-
emoncms_connected = true;
5770
}
71+
emoncms_result(success, doc["message"]);
5872
} else if (result == "ok") {
5973
packets_success++;
60-
emoncms_connected = true;
74+
emoncms_result(true, result);
6175
} else {
62-
emoncms_connected = false;
6376
DEBUG.print("Emoncms error: ");
6477
DEBUG.printf("%.*s\n", result.length(), (const char *)result);
78+
emoncms_result(false, result.toString());
79+
}
80+
}, [](MongooseHttpClientResponse *response)
81+
{
82+
DBUGF("onClose %p", response);
83+
if(NULL == response) {
84+
emoncms_result(false, String("Failed to connect"));
6585
}
6686
});
87+
} else {
88+
emoncms_result(false, String("Disabled"));
6789
}
6890

6991
Profile_End(emoncms_publish, 10);

src/emoncms.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
// -------------------------------------------------------------------
1010

1111
extern boolean emoncms_connected;
12+
extern boolean emoncms_updated;
13+
1214
extern unsigned long packets_sent;
1315
extern unsigned long packets_success;
1416

src/input.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ void create_rapi_json(JsonDocument &doc)
102102
doc["state"] = state;
103103
doc["freeram"] = ESPAL.getFreeHeap();
104104
doc["divertmode"] = divertmode;
105+
doc["srssi"] = WiFi.RSSI();
105106
}
106107

107108
// -------------------------------------------------------------------

src/main.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,9 +193,7 @@ loop() {
193193
DynamicJsonDocument data(4096);
194194
create_rapi_json(data); // create JSON Strings for EmonCMS and MQTT
195195

196-
if (config_emoncms_enabled()) {
197-
emoncms_publish(data);
198-
}
196+
emoncms_publish(data);
199197

200198
teslaClient.getChargeInfoJson(data);
201199
event_send(data);
@@ -207,6 +205,15 @@ loop() {
207205

208206
Timer1 = millis();
209207
}
208+
209+
if(emoncms_updated)
210+
{
211+
// Send the current state to check the config
212+
DynamicJsonDocument data(4096);
213+
create_rapi_json(data);
214+
emoncms_publish(data);
215+
emoncms_updated = false;
216+
}
210217
} // end WiFi connected
211218

212219
Profile_End(loop, 10);

src/web_server.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,7 @@ handleStatus(MongooseHttpServerRequest *request) {
568568
doc["srssi"] = WiFi.RSSI();
569569
doc["ipaddress"] = ipaddress;
570570

571-
doc["emoncms_connected"] = emoncms_connected;
571+
doc["emoncms_connected"] = (int)emoncms_connected;
572572
doc["packets_sent"] = packets_sent;
573573
doc["packets_success"] = packets_success;
574574

src/web_static/web_server.home.html.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ static const char CONTENT_HOME_HTML[] PROGMEM =
44
" optionsText: function(item) {\n"
55
" return item + '://'\n"
66
" },\n"
7-
" value: emoncms_protocol\"></select> <input type=\"text\" autocapitalize=\"none\" data-bind=\"textInput: emoncms_server\"> </div> <div class=\"small-text\">e.g: <a href=\"https://data.openevse.com/emoncms\">data.openevse.com/emoncms</a>, <a href=\"https://emoncms.org\">emoncms.org</a>, <a href=\"http://emonpi/emoncms\">emonpi/emoncms</a> </div> </div> <p data-bind=\"visible: config.emoncms_enabled\"> <b>Emoncms Node*:</b><br> <input type=\"text\" autocapitalize=\"none\" data-bind=\"textInput: config.emoncms_node\"> </p> <p data-bind=\"visible: config.emoncms_enabled\"> <b>Emoncms write-apikey*:</b><br> <input type=\"password\" autocapitalize=\"none\" data-bind=\"textInput: emoncmsApiKey.value, attr: { type: emoncmsApiKey.show() ? 'text' : 'password' }\"><br> <span> <input id=\"emoncmsApiKey\" type=\"checkbox\" data-bind=\"checked: emoncmsApiKey.show\"> <label for=\"emoncmsApiKey\">Show password</label> </span> </p> <p data-bind=\"visible: config.emoncms_enabled && config.http_supported_protocols().length === 0\"> <b>Emoncms SSL SHA-1 Fingerprint (optional):</b><br> <input type=\"text\" autocapitalize=\"none\" data-bind=\"textInput: config.emoncms_fingerprint\"><br> <br><span class=\"small-text\">HTTPS will be enabled if present e.g:</span> <span class=\"small-text\"> 7D:82:15:BE:D7:BC:72:58:87:7D:8E:40:D4:80:BA:1A:9F:8B:8D:DA </span> </p> <p> <button data-bind=\"click: saveEmonCms, text: (saveEmonCmsFetching() ? 'Saving' : (saveEmonCmsSuccess() ? 'Saved' : 'Save')), disable: saveEmonCmsFetching\">Save</button> <span data-bind=\"visible: config.emoncms_enabled\"><b>&nbsp; Connected:&nbsp;<span data-bind=\"text: 1 === status.emoncms_connected() ? 'Yes' : 'No'\"></span></b></span> <span data-bind=\"visible: config.emoncms_enabled() &amp;&amp; 1 === status.emoncms_connected()\"><b>&nbsp; Successful posts:&nbsp;<span data-bind=\"text: status.packets_success\"></span></b></span> </p> </div> <div class=\"box380 right\"> <h2>MQTT</h2> <p> <input type=\"checkbox\" id=\"mqtt_enabled\" data-bind=\"checked: config.mqtt_enabled\"> <label for=\"mqtt_enabled\"><b>Enable MQTT</b></label> <span class=\"info\" data-bind=\"click: toggle.bind($data, showMqttInfo)\"></span> </p> <div class=\"box\" data-bind=\"visible: showMqttInfo\"> <div> Status published to:<br> <span class=\"small-text\">{base-topic}/{status} value</span><br> <span class=\"small-text\">e.g. <span data-bind=\"text: '' !== config.mqtt_topic() ? config.mqtt_topic() : 'openevse'\"></span>/amp 16</span><br> </div> <p> RAPI control subscribes to:<br> <span class=\"small-text\">{base-topic}/rapi/in/{command} value</span><br> <span class=\"small-text\">e.g. <span data-bind=\"text: '' !== config.mqtt_topic() ? config.mqtt_topic() : 'openevse'\"></span>/rapi/in/$SC 16</span><br> <span class=\"small-text\">e.g. <span data-bind=\"text: '' !== config.mqtt_topic() ? config.mqtt_topic() : 'openevse'\"></span>/rapi/in/$GC</span><br> </p> <p> RAPI response published to:<br> <span class=\"small-text\">{base-topic}/rapi/out response</span><br> <span class=\"small-text\">e.g. <span data-bind=\"text: '' !== config.mqtt_topic() ? config.mqtt_topic() : 'openevse'\"></span>/rapi/out $OK 6 32</span><br> </p> </div> <div data-bind=\"visible: config.mqtt_enabled\"> <b>Host*:</b><br> <div data-bind=\"css: { protocol: config.mqtt_supported_protocols().length > 0 }\"> <select data-bind=\"visible: config.mqtt_protocol_enable,\n"
7+
" value: emoncms_protocol\"></select> <input type=\"text\" autocapitalize=\"none\" data-bind=\"textInput: emoncms_server\"> </div> <div class=\"small-text\">e.g: <a href=\"https://data.openevse.com/emoncms\">data.openevse.com/emoncms</a>, <a href=\"https://emoncms.org\">emoncms.org</a>, <a href=\"http://emonpi/emoncms\">emonpi/emoncms</a> </div> </div> <p data-bind=\"visible: config.emoncms_enabled\"> <b>Emoncms Node*:</b><br> <input type=\"text\" autocapitalize=\"none\" data-bind=\"textInput: config.emoncms_node\"> </p> <p data-bind=\"visible: config.emoncms_enabled\"> <b>Emoncms write-apikey*:</b><br> <input type=\"password\" autocapitalize=\"none\" data-bind=\"textInput: emoncmsApiKey.value, attr: { type: emoncmsApiKey.show() ? 'text' : 'password' }\"><br> <span> <input id=\"emoncmsApiKey\" type=\"checkbox\" data-bind=\"checked: emoncmsApiKey.show\"> <label for=\"emoncmsApiKey\">Show password</label> </span> </p> <p data-bind=\"visible: config.emoncms_enabled && config.http_supported_protocols().length === 0\"> <b>Emoncms SSL SHA-1 Fingerprint (optional):</b><br> <input type=\"text\" autocapitalize=\"none\" data-bind=\"textInput: config.emoncms_fingerprint\"><br> <br><span class=\"small-text\">HTTPS will be enabled if present e.g:</span> <span class=\"small-text\"> 7D:82:15:BE:D7:BC:72:58:87:7D:8E:40:D4:80:BA:1A:9F:8B:8D:DA </span> </p> <p> <button data-bind=\"click: saveEmonCms, text: (saveEmonCmsFetching() ? 'Saving' : (saveEmonCmsSuccess() ? 'Saved' : 'Save')), disable: saveEmonCmsFetching\">Save</button> <span data-bind=\"visible: config.emoncms_enabled\"><b>&nbsp; Connected:&nbsp;<span data-bind=\"text: 1 === status.emoncms_connected() ? 'Yes' : 'No'\"></span></b></span> <span data-bind=\"visible: config.emoncms_enabled() &amp;&amp; 1 === status.emoncms_connected()\"><b>&nbsp; Successful posts:&nbsp;<span data-bind=\"text: status.packets_success\"></span></b></span> </p> <p data-bind=\"visible: config.emoncms_enabled() &amp;&amp; 0 === status.emoncms_connected() &amp;&amp; false !== status.emoncms_message(), text: status.emoncms_message\"></p> </div> <div class=\"box380 right\"> <h2>MQTT</h2> <p> <input type=\"checkbox\" id=\"mqtt_enabled\" data-bind=\"checked: config.mqtt_enabled\"> <label for=\"mqtt_enabled\"><b>Enable MQTT</b></label> <span class=\"info\" data-bind=\"click: toggle.bind($data, showMqttInfo)\"></span> </p> <div class=\"box\" data-bind=\"visible: showMqttInfo\"> <div> Status published to:<br> <span class=\"small-text\">{base-topic}/{status} value</span><br> <span class=\"small-text\">e.g. <span data-bind=\"text: '' !== config.mqtt_topic() ? config.mqtt_topic() : 'openevse'\"></span>/amp 16</span><br> </div> <p> RAPI control subscribes to:<br> <span class=\"small-text\">{base-topic}/rapi/in/{command} value</span><br> <span class=\"small-text\">e.g. <span data-bind=\"text: '' !== config.mqtt_topic() ? config.mqtt_topic() : 'openevse'\"></span>/rapi/in/$SC 16</span><br> <span class=\"small-text\">e.g. <span data-bind=\"text: '' !== config.mqtt_topic() ? config.mqtt_topic() : 'openevse'\"></span>/rapi/in/$GC</span><br> </p> <p> RAPI response published to:<br> <span class=\"small-text\">{base-topic}/rapi/out response</span><br> <span class=\"small-text\">e.g. <span data-bind=\"text: '' !== config.mqtt_topic() ? config.mqtt_topic() : 'openevse'\"></span>/rapi/out $OK 6 32</span><br> </p> </div> <div data-bind=\"visible: config.mqtt_enabled\"> <b>Host*:</b><br> <div data-bind=\"css: { protocol: config.mqtt_supported_protocols().length > 0 }\"> <select data-bind=\"visible: config.mqtt_protocol_enable,\n"
88
" options: config.mqtt_supported_protocols,\n"
99
" optionsText: function(item) {\n"
1010
" return item + '://'\n"

src/web_static/web_server.lib.js.h

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)