Skip to content

Commit

Permalink
v3.13
Browse files Browse the repository at this point in the history
  • Loading branch information
pvtom committed Jan 26, 2024
1 parent d4ea9ff commit cdcc3eb
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 67 deletions.
12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,19 +140,19 @@ or in verbose mode
If everything works properly, you will see something like this:

```
rscp2mqtt [v3.12]
rscp2mqtt [v3.13]
E3DC system >192.168.178.111:5033< user: >your E3DC user<
MQTT broker >localhost:1883< qos = >0< retain = >false< client id >✗< prefix >e3dc<
Fetching data every second.
Requesting PVI ✓ | PM ✓ | DCB (1 battery string) ✓ | Wallbox ✗ | Autorefresh ✓
Log level = 0
Stdout to terminal
[2024-01-21 22:00:00] pid=30120 ppid=1 RscpMqttMain.cpp(2307) Connecting to server 192.168.178.111:5033
[2024-01-21 22:00:00] pid=30120 ppid=1 RscpMqttMain.cpp(2314) Success: E3DC connected.
[2024-01-21 22:00:00] pid=30120 ppid=1 RscpMqttMain.cpp(1381) RSCP authentication level 10
[2024-01-21 22:00:00] pid=30120 ppid=1 RscpMqttMain.cpp(1908) Connecting to broker localhost:1883
[2024-01-21 22:00:00] pid=30120 ppid=1 RscpMqttMain.cpp(1917) Success: MQTT broker connected.
[2024-01-26 16:45:00] pid=30130 ppid=1 RscpMqttMain.cpp(2317) Connecting to server 192.168.178.111:5033
[2024-01-26 16:45:00] pid=30130 ppid=1 RscpMqttMain.cpp(2324) Success: E3DC connected.
[2024-01-26 16:45:00] pid=30130 ppid=1 RscpMqttMain.cpp(1391) RSCP authentication level 10
[2024-01-26 16:45:00] pid=30130 ppid=1 RscpMqttMain.cpp(1918) Connecting to broker localhost:1883
[2024-01-26 16:45:00] pid=30130 ppid=1 RscpMqttMain.cpp(1927) Success: MQTT broker connected.
```

Check the configuration if the connections are not established.
Expand Down
4 changes: 4 additions & 0 deletions RELEASE.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
## Release Notes

### Release v3.13 (26.01.2024)

- Issue #44: Cleanup rsoc / soc topics. Prevention of SOC toggling.

### Release v3.12 (21.01.2024)

- Issue #43: Disable auto detection of the number of PVI trackers by setting PVI_TRACKER in .config
Expand Down
54 changes: 32 additions & 22 deletions RscpMqttMain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
#include <regex>
#include <mutex>

#define RSCP2MQTT "v3.12"
#define RSCP2MQTT "v3.13"

#define AES_KEY_SIZE 32
#define AES_BLOCK_SIZE 32
Expand Down Expand Up @@ -596,13 +596,27 @@ int handleImmediately(RscpProtocol *protocol, SRscpValue *response, uint32_t con
for (std::vector<RSCP_MQTT::cache_t>::iterator it = RSCP_MQTT::RscpMqttCacheTempl.begin(); it != RSCP_MQTT::RscpMqttCacheTempl.end(); ++it) {
if ((it->container == container) && (it->tag == response->tag)) {
snprintf(topic, TOPIC_SIZE, it->topic, year, month, day);
snprintf(payload, PAYLOAD_SIZE, "%0.2f", protocol->getValueAsFloat32(response) / it->divisor);
// only float is handled
switch (it->format) {
case F_FLOAT_0 : {
snprintf(payload, PAYLOAD_SIZE, "%.0f", protocol->getValueAsFloat32(response) / it->divisor);
break;
}
case F_FLOAT_1 : {
snprintf(payload, PAYLOAD_SIZE, "%0.1f", protocol->getValueAsFloat32(response) / it->divisor);
break;
}
case F_FLOAT_2 : {
snprintf(payload, PAYLOAD_SIZE, "%0.2f", protocol->getValueAsFloat32(response) / it->divisor);
break;
}
}
if (cfg.mqtt_pub && mosq) rc = mosquitto_publish(mosq, NULL, topic, strlen(payload), payload, cfg.mqtt_qos, cfg.mqtt_retain);
#ifdef INFLUXDB
l->tm_mday = day;
l->tm_mon = month - 1;
l->tm_year = year - 1900;
sprintf(ts, "%llu000000000", timegm(l) - gmt_diff);
sprintf(ts, "%llu000000000", (long long unsigned)(timegm(l) - gmt_diff));
if (cfg.influxdb_on && curl) {
for (std::vector<RSCP_MQTT::topic_store_t>::iterator store = RSCP_MQTT::TopicStore.begin(); store != RSCP_MQTT::TopicStore.end(); ++store) {
if ((store->type == INFLUXDB_TOPIC) && std::regex_match(topic, std::regex(store->topic))) {
Expand Down Expand Up @@ -654,6 +668,17 @@ int storeStringValue(std::vector<RSCP_MQTT::cache_t> & c, uint32_t container, ui
return(1);
}

int getIntegerValue(std::vector<RSCP_MQTT::cache_t> & c, uint32_t container, uint32_t tag, int index) {
int value = 0;
for (std::vector<RSCP_MQTT::cache_t>::iterator it = c.begin(); it != c.end(); ++it) {
if ((it->container == container) && (it->tag == tag) && (it->index == index)) {
value = atoi(it->payload);
break;
}
}
return(value);
}

int storeResponseValue(std::vector<RSCP_MQTT::cache_t> & c, RscpProtocol *protocol, SRscpValue *response, uint32_t container, int index) {
char buf[PAYLOAD_SIZE];
int rc = -1;
Expand Down Expand Up @@ -713,14 +738,6 @@ int storeResponseValue(std::vector<RSCP_MQTT::cache_t> & c, RscpProtocol *protoc
}
break;
}
case RSCP::eTypeUInt64: {
snprintf(buf, PAYLOAD_SIZE, "%lu", protocol->getValueAsUInt64(response));
if (strcmp(it->payload, buf)) {
strcpy(it->payload, buf);
it->changed = true;
}
break;
}
case RSCP::eTypeChar8: {
snprintf(buf, PAYLOAD_SIZE, "%i", protocol->getValueAsChar8(response));
if (strcmp(it->payload, buf)) {
Expand Down Expand Up @@ -791,22 +808,14 @@ int storeResponseValue(std::vector<RSCP_MQTT::cache_t> & c, RscpProtocol *protoc
struct tm *l = localtime(&rawtime);
handleImmediately(protocol, response, TAG_DB_HISTORY_DATA_DAY, l->tm_year + 1900, l->tm_mon + 1, l->tm_mday);
}
if ((it->tag == TAG_EMS_BAT_SOC) && (!strcmp(it->payload, "0")) && (cfg.battery_strings == 1) && (it->changed)) { // Issue #44 - prevent SOC toggling
snprintf(it->payload, PAYLOAD_SIZE, "%d", getIntegerValue(c, TAG_BAT_DATA, TAG_BAT_RSOC, 0));
}
}
}
return(rc);
}

int getIntegerValue(std::vector<RSCP_MQTT::cache_t> & c, uint32_t container, uint32_t tag, int index) {
int value = 0;
for (std::vector<RSCP_MQTT::cache_t>::iterator it = c.begin(); it != c.end(); ++it) {
if ((it->container == container) && (it->tag == tag) && (it->index == index)) {
value = atoi(it->payload);
break;
}
}
return(value);
}

void socLimiter(std::vector<RSCP_MQTT::cache_t> & c, RscpProtocol *protocol, SRscpValue *rootContainer, bool day_switch) {
static int charge_locked = 0;
static int discharge_locked = 0;
Expand Down Expand Up @@ -973,6 +982,7 @@ int createRequest(SRscpFrameBuffer * frameBuffer) {
protocol.appendValue(&batteryContainer, TAG_BAT_INDEX, i);
protocol.appendValue(&batteryContainer, TAG_BAT_REQ_ASOC);
protocol.appendValue(&batteryContainer, TAG_BAT_REQ_RSOC);
protocol.appendValue(&batteryContainer, TAG_BAT_REQ_RSOC_REAL);
protocol.appendValue(&batteryContainer, TAG_BAT_REQ_MODULE_VOLTAGE);
protocol.appendValue(&batteryContainer, TAG_BAT_REQ_CURRENT);
protocol.appendValue(&batteryContainer, TAG_BAT_REQ_CHARGE_CYCLES);
Expand Down
37 changes: 19 additions & 18 deletions RscpMqttMapping.h
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@ cache_t cache[] = {
{ TAG_SE_EP_RESERVE, TAG_SE_PARAM_EP_RESERVE, 0, "reserve/percent", "", F_FLOAT_2, UNIT_PERCENT, 1, 0, false, false, false },
{ TAG_SE_EP_RESERVE, TAG_SE_PARAM_EP_RESERVE_W, 0, "reserve/energy", "", F_FLOAT_2, UNIT_WH, 1, 0, false, false, false },
{ TAG_SE_EP_RESERVE, TAG_SE_PARAM_EP_RESERVE_MAX_W, 0, "reserve/max", "", F_FLOAT_2, UNIT_WH, 1, 0, false, false, false },
{ TAG_SE_EP_RESERVE, TAG_SE_PARAM_LAST_SOC, 0, "reserve/last_soc", "", F_FLOAT_2, UNIT_PERCENT, 1, 0, false, false, false },
{ TAG_SE_EP_RESERVE, TAG_SE_PARAM_LAST_SOC, 0, "reserve/last_soc", "", F_FLOAT_1, UNIT_PERCENT, 1, 0, false, false, false },
// CONTAINER TAG_DB_HISTORY_DATA_...
// TODAY
{ TAG_DB_HISTORY_DATA_DAY, TAG_DB_BAT_POWER_IN, 0, "battery/energy/charge", "", F_FLOAT_2, UNIT_KWH, 1000, 0, false, false, false },
Expand Down Expand Up @@ -282,11 +282,11 @@ cache_t cache[] = {
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_GRID_POWER_IN, 0, "year/grid/energy/in", "", F_FLOAT_0, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_GRID_POWER_OUT, 0, "year/grid/energy/out", "", F_FLOAT_0, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_CONSUMPTION, 0, "year/home/energy", "", F_FLOAT_0, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_PM_0_POWER, 0, "year/pm_0/energy", "", F_FLOAT_2, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_PM_1_POWER, 0, "year/pm_1/energy", "", F_FLOAT_2, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_PM_0_POWER, 0, "year/pm_0/energy", "", F_FLOAT_0, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_PM_1_POWER, 0, "year/pm_1/energy", "", F_FLOAT_0, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_BAT_CHARGE_LEVEL, 0, "year/battery/rsoc", "", F_FLOAT_1, UNIT_PERCENT, 1, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_CONSUMED_PRODUCTION, 0, "year/consumed", "", F_FLOAT_0, UNIT_PERCENT, 1, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_AUTARKY, 0, "year/autarky", "", F_FLOAT_0, UNIT_PERCENT, 1, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_CONSUMED_PRODUCTION, 0, "year/consumed", "", F_FLOAT_1, UNIT_PERCENT, 1, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_AUTARKY, 0, "year/autarky", "", F_FLOAT_1, UNIT_PERCENT, 1, 0, false, false, false },
// WALLBOX
{ 0, TAG_EMS_POWER_WB_ALL, 0, "wallbox/total/power", "", F_AUTO, UNIT_W, 1, 0, false, false, false },
{ 0, TAG_EMS_POWER_WB_SOLAR, 0, "wallbox/solar/power", "", F_AUTO, UNIT_W, 1, 0, false, false, false },
Expand All @@ -311,31 +311,32 @@ std::vector<cache_t> RscpMqttCache(cache, cache + sizeof(cache) / sizeof(cache_t

cache_t templates[] = {
// DAY
{ TAG_DB_HISTORY_DATA_DAY, TAG_DB_BAT_POWER_IN, 1, "day/%d/%d/%d/battery/energy/charge", "", F_FLOAT_0, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_DAY, TAG_DB_BAT_POWER_OUT, 1, "day/%d/%d/%d/battery/energy/discharge", "", F_FLOAT_0, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_DAY, TAG_DB_DC_POWER, 1, "day/%d/%d/%d/solar/energy", "", F_FLOAT_0, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_DAY, TAG_DB_GRID_POWER_IN, 1, "day/%d/%d/%d/grid/energy/in", "", F_FLOAT_0, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_DAY, TAG_DB_GRID_POWER_OUT, 1, "day/%d/%d/%d/grid/energy/out", "", F_FLOAT_0, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_DAY, TAG_DB_CONSUMPTION, 1, "day/%d/%d/%d/home/energy", "", F_FLOAT_0, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_DAY, TAG_DB_BAT_POWER_IN, 1, "day/%d/%d/%d/battery/energy/charge", "", F_FLOAT_2, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_DAY, TAG_DB_BAT_POWER_OUT, 1, "day/%d/%d/%d/battery/energy/discharge", "", F_FLOAT_2, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_DAY, TAG_DB_DC_POWER, 1, "day/%d/%d/%d/solar/energy", "", F_FLOAT_2, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_DAY, TAG_DB_GRID_POWER_IN, 1, "day/%d/%d/%d/grid/energy/in", "", F_FLOAT_2, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_DAY, TAG_DB_GRID_POWER_OUT, 1, "day/%d/%d/%d/grid/energy/out", "", F_FLOAT_2, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_DAY, TAG_DB_CONSUMPTION, 1, "day/%d/%d/%d/home/energy", "", F_FLOAT_2, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_DAY, TAG_DB_PM_0_POWER, 1, "day/%d/%d/%d/pm_0/energy", "", F_FLOAT_2, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_DAY, TAG_DB_PM_1_POWER, 1, "day/%d/%d/%d/pm_1/energy", "", F_FLOAT_2, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_DAY, TAG_DB_BAT_CHARGE_LEVEL, 1, "day/%d/%d/%d/battery/rsoc", "", F_FLOAT_1, UNIT_PERCENT, 1, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_DAY, TAG_DB_CONSUMED_PRODUCTION, 1, "day/%d/%d/%d/consumed", "", F_FLOAT_0, UNIT_PERCENT, 1, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_DAY, TAG_DB_AUTARKY, 1, "day/%d/%d/%d/autarky", "", F_FLOAT_0, UNIT_PERCENT, 1, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_DAY, TAG_DB_CONSUMED_PRODUCTION, 1, "day/%d/%d/%d/consumed", "", F_FLOAT_1, UNIT_PERCENT, 1, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_DAY, TAG_DB_AUTARKY, 1, "day/%d/%d/%d/autarky", "", F_FLOAT_1, UNIT_PERCENT, 1, 0, false, false, false },
// YEAR
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_BAT_POWER_IN, 1, "history/%d/battery/energy/charge", "", F_FLOAT_0, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_BAT_POWER_OUT, 1, "history/%d/battery/energy/discharge", "", F_FLOAT_0, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_DC_POWER, 1, "history/%d/solar/energy", "", F_FLOAT_0, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_GRID_POWER_IN, 1, "history/%d/grid/energy/in", "", F_FLOAT_0, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_GRID_POWER_OUT, 1, "history/%d/grid/energy/out", "", F_FLOAT_0, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_CONSUMPTION, 1, "history/%d/home/energy", "", F_FLOAT_0, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_PM_0_POWER, 1, "history/%d/pm_0/energy", "", F_FLOAT_2, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_PM_1_POWER, 1, "history/%d/pm_1/energy", "", F_FLOAT_2, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_PM_0_POWER, 1, "history/%d/pm_0/energy", "", F_FLOAT_0, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_PM_1_POWER, 1, "history/%d/pm_1/energy", "", F_FLOAT_0, UNIT_KWH, 1000, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_BAT_CHARGE_LEVEL, 1, "history/%d/battery/rsoc", "", F_FLOAT_1, UNIT_PERCENT, 1, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_CONSUMED_PRODUCTION, 1, "history/%d/consumed", "", F_FLOAT_0, UNIT_PERCENT, 1, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_AUTARKY, 1, "history/%d/autarky", "", F_FLOAT_0, UNIT_PERCENT, 1, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_CONSUMED_PRODUCTION, 1, "history/%d/consumed", "", F_FLOAT_1, UNIT_PERCENT, 1, 0, false, false, false },
{ TAG_DB_HISTORY_DATA_YEAR, TAG_DB_AUTARKY, 1, "history/%d/autarky", "", F_FLOAT_1, UNIT_PERCENT, 1, 0, false, false, false },
// TAG_BAT_DATA
{ TAG_BAT_DATA, TAG_BAT_RSOC, 1, "%s/rsoc", "", F_FLOAT_1, UNIT_PERCENT, 1, 0, false, false, false },
{ TAG_BAT_DATA, TAG_BAT_RSOC, 1, "%s/soc_float", "", F_FLOAT_1, UNIT_PERCENT, 1, 0, false, false, false },
{ TAG_BAT_DATA, TAG_BAT_RSOC_REAL, 1, "%s/rsoc_real", "", F_FLOAT_1, UNIT_PERCENT, 1, 0, false, false, false },
{ TAG_BAT_DATA, TAG_BAT_MODULE_VOLTAGE, 1, "%s/voltage", "", F_FLOAT_2, UNIT_V, 1, 0, false, false, false },
{ TAG_BAT_DATA, TAG_BAT_CURRENT, 1, "%s/current", "", F_FLOAT_2, UNIT_A, 1, 0, false, false, false },
{ TAG_BAT_DATA, TAG_BAT_CHARGE_CYCLES, 1, "%s/cycles", "", F_AUTO, UNIT_NONE, 1, 0, false, false, false },
Expand Down
2 changes: 2 additions & 0 deletions RscpTags.h
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,8 @@
#define TAG_BAT_INDEX 0x03040001
#define TAG_BAT_DATA 0x03840000
#define TAG_BAT_RSOC 0x03800001
#define TAG_BAT_RSOC_REAL 0x0380000E
#define TAG_BAT_REQ_RSOC_REAL 0x0300000E
#define TAG_BAT_MODULE_VOLTAGE 0x03800002
#define TAG_BAT_CURRENT 0x03800003
#define TAG_BAT_MAX_BAT_VOLTAGE 0x03800004
Expand Down
Loading

0 comments on commit cdcc3eb

Please sign in to comment.