diff --git a/docs/mqtt.md b/docs/mqtt.md index ea99d79c..bd61f8eb 100644 --- a/docs/mqtt.md +++ b/docs/mqtt.md @@ -44,6 +44,11 @@ Scheduler data: `/scheduler/set ` : set/update schedules ( data as refered from API: https://openevse.stoplight.io/docs/openevse-wifi-v4/e87e6f3f90787-batch-update-schedule ) `/scheduler/clear :`remove related event +Limit: +`/limit/` : get limit data ([json data] +`/limit/set ` : set/update limit ( data as refered from API:https://openevse.stoplight.io/docs/openevse-wifi-v4/c410fb5e48294-set-charge-limit ) +`/limit/set clear` : clear current limit + Main settings: `/divertmode/set [1 | 2]` : enable (1)/ disable (2) divert mode diff --git a/gui-v2 b/gui-v2 index 09d033a6..10e989df 160000 --- a/gui-v2 +++ b/gui-v2 @@ -1 +1 @@ -Subproject commit 09d033a61e2e4ed8799300479e9c0d49edb7a0b4 +Subproject commit 10e989df21e0cf5a9b12bb9f54ea725ee2a6220f diff --git a/src/limit.h b/src/limit.h index ac12f1e3..f1788390 100644 --- a/src/limit.h +++ b/src/limit.h @@ -20,7 +20,7 @@ class LimitType { Soc, Range }; - + LimitType() = default; constexpr LimitType(Value value) : _value(value) { } uint8_t fromString(const char *value); diff --git a/src/mqtt.cpp b/src/mqtt.cpp index cefdadba..47af38c5 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -25,6 +25,7 @@ MongooseMqttClient mqttclient; EvseProperties claim_props; EvseProperties override_props; +LimitProperties limit_props; DynamicJsonDocument mqtt_doc(4096); static long nextMqttReconnectAttempt = 0; @@ -33,6 +34,7 @@ static bool connecting = false; uint8_t claimsVersion = 0; uint8_t overrideVersion = 0; uint8_t scheduleVersion = 0; +uint8_t limitVersion = 0; String lastWill = ""; @@ -68,14 +70,13 @@ void mqttmsg_callback(MongooseString topic, MongooseString payload) { if (shaper.getState()) { shaper.shapeCurrent(); } - } else if (topic_string == mqtt_grid_ie) { grid_ie = payload_str.toInt(); DBUGF("grid:%dW", grid_ie); divert.update_state(); - + // if shaper use the same topic as grid_ie if (mqtt_live_pwr == mqtt_grid_ie) { shaper.setLivePwr(grid_ie); @@ -183,6 +184,16 @@ void mqttmsg_callback(MongooseString topic, MongooseString payload) { mqtt_clear_schedule(payload_str.toInt()); } + else if (topic_string == mqtt_topic + "/limit/set") { + if (payload_str.equals("clear")) { + DBUGLN("clearing limits"); + limit.clear(); + } + else if (limit_props.deserialize(payload_str)) { + mqtt_set_limit(limit_props); + } + } + // Restart else if (topic_string == mqtt_topic + "/restart") { restart_system(); @@ -292,6 +303,7 @@ mqtt_connect() mqtt_publish_override(); mqtt_publish_claim(); mqtt_publish_schedule(); + mqtt_publish_limit(); // MQTT Topic to subscribe to receive RAPI commands via MQTT String mqtt_sub_topic = mqtt_topic + "/rapi/in/#"; @@ -366,6 +378,10 @@ mqtt_connect() mqttclient.subscribe(mqtt_sub_topic); yield(); + mqtt_sub_topic = mqtt_topic + "/limit/set"; + mqttclient.subscribe(mqtt_sub_topic); + yield(); + // ask for a system restart mqtt_sub_topic = mqtt_topic + "/restart"; mqttclient.subscribe(mqtt_sub_topic); @@ -489,6 +505,24 @@ mqtt_publish_schedule() { } } +void +mqtt_set_limit(LimitProperties &limitProps) { + Profile_Start(mqtt_set_limit); + limit.set(limitProps); + mqtt_publish_limit(); + Profile_End(mqtt_set_limit, 5); +} + +void +mqtt_publish_limit() { + LimitProperties limitProps; + const size_t capacity = JSON_OBJECT_SIZE(3) + 512; + DynamicJsonDocument limit_data(capacity); + limitProps = limit.get(); + bool success = limitProps.serialize(limit_data); + mqtt_publish_json(limit_data, "/limit"); +} + void mqtt_publish_json(JsonDocument &data, const char* topic) { Profile_Start(mqtt_publish_json); @@ -555,6 +589,11 @@ mqtt_loop() { DBUGF("Schedule has changed, publishing to MQTT"); scheduleVersion = scheduler.getVersion(); } + if (limitVersion != limit.getVersion()) { + mqtt_publish_limit(); + DBUGF("Limit has changed, publishing to MQTT"); + limitVersion = limit.getVersion(); + } } Profile_End(mqtt_loop, 5); } diff --git a/src/mqtt.h b/src/mqtt.h index 68c9e548..ce4d9007 100644 --- a/src/mqtt.h +++ b/src/mqtt.h @@ -8,11 +8,14 @@ #include #include #include "evse_man.h" +#include "limit.h" -#define MQTT_PROTOCOL_MQTT 0 -#define MQTT_PROTOCOL_MQTT_SSL 1 -#define MQTT_PROTOCOL_WEBSOCKET 2 -#define MQTT_PROTOCOL_WEBSOCKET_SSL 3 +enum mqtt_protocol { + MQTT_PROTOCOL_MQTT, + MQTT_PROTOCOL_MQTT_SSL, + MQTT_PROTOCOL_WEBSOCKET, + MQTT_PROTOCOL_WEBSOCKET_SSL +}; #define MQTT_LOOP 500 @@ -37,6 +40,8 @@ extern void mqtt_publish_json(JsonDocument &data, const char* topic); extern void mqtt_publish_schedule(); extern void mqtt_set_schedule(String schedule); extern void mqtt_clear_schedule(uint32_t event); +extern void mqtt_publish_limit(); +extern void mqtt_set_limit(LimitProperties &limitProps); // ------------------------------------------------------------------- // Restart the MQTT connection