Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add /limit /limit/set to mqtt #637

Merged
merged 3 commits into from
May 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions docs/mqtt.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ Scheduler data:
`<base-topic>/scheduler/set <json data>` : set/update schedules ( data as refered from API: https://openevse.stoplight.io/docs/openevse-wifi-v4/e87e6f3f90787-batch-update-schedule )
`<base-topic>/scheduler/clear <id> :`remove related event

Limit:
`<base-topic>/limit/` : get limit data ([json data]
`<base-topic>/limit/set <json data>` : set/update limit ( data as refered from API:https://openevse.stoplight.io/docs/openevse-wifi-v4/c410fb5e48294-set-charge-limit )
`<base-topic>/limit/set clear` : clear current limit

Main settings:

`<base-topic>/divertmode/set [1 | 2]` : enable (1)/ disable (2) divert mode
Expand Down
2 changes: 1 addition & 1 deletion gui-v2
Submodule gui-v2 updated 1 files
+357 −355 package-lock.json
2 changes: 1 addition & 1 deletion src/limit.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class LimitType {
Soc,
Range
};

LimitType() = default;
constexpr LimitType(Value value) : _value(value) { }
uint8_t fromString(const char *value);
Expand Down
43 changes: 41 additions & 2 deletions src/mqtt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
MongooseMqttClient mqttclient;
EvseProperties claim_props;
EvseProperties override_props;
LimitProperties limit_props;
DynamicJsonDocument mqtt_doc(4096);

static long nextMqttReconnectAttempt = 0;
Expand All @@ -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 = "";

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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/#";
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
}
Expand Down
13 changes: 9 additions & 4 deletions src/mqtt.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,14 @@
#include <Arduino.h>
#include <ArduinoJson.h>
#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

Expand All @@ -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
Expand Down