mirror of
https://github.com/UtilitechAS/amsreader-firmware.git
synced 2026-01-22 02:35:29 +00:00
228 lines
6.5 KiB
C++
228 lines
6.5 KiB
C++
#include "JsonMqttHandler.h"
|
|
#include "hexutils.h"
|
|
#include "Uptime.h"
|
|
#include "web/root/json1_json.h"
|
|
#include "web/root/json2_json.h"
|
|
#include "web/root/json3_json.h"
|
|
#include "web/root/jsonsys_json.h"
|
|
#include "web/root/jsonprices_json.h"
|
|
|
|
bool JsonMqttHandler::publish(AmsData* data, AmsData* previousState) {
|
|
if(topic.isEmpty() || !mqtt->connected())
|
|
return false;
|
|
|
|
double vcc = hw->getVcc();
|
|
if(data->getListType() == 1) {
|
|
char json[192];
|
|
snprintf_P(json, sizeof(json), JSON1_JSON,
|
|
WiFi.macAddress().c_str(),
|
|
clientId.c_str(),
|
|
(uint32_t) (millis64()/1000),
|
|
data->getPackageTimestamp(),
|
|
vcc,
|
|
hw->getWifiRssi(),
|
|
hw->getTemperature(),
|
|
data->getActiveImportPower()
|
|
);
|
|
return mqtt->publish(topic, json);
|
|
} else if(data->getListType() == 2) {
|
|
char json[256];
|
|
snprintf_P(json, sizeof(json), JSON2_JSON,
|
|
WiFi.macAddress().c_str(),
|
|
clientId.c_str(),
|
|
(uint32_t) (millis64()/1000),
|
|
data->getPackageTimestamp(),
|
|
vcc,
|
|
hw->getWifiRssi(),
|
|
hw->getTemperature(),
|
|
data->getListId().c_str(),
|
|
data->getMeterId().c_str(),
|
|
data->getMeterType().c_str(),
|
|
data->getActiveImportPower(),
|
|
data->getReactiveImportPower(),
|
|
data->getActiveExportPower(),
|
|
data->getReactiveExportPower(),
|
|
data->getL1Current(),
|
|
data->getL2Current(),
|
|
data->getL3Current(),
|
|
data->getL1Voltage(),
|
|
data->getL2Voltage(),
|
|
data->getL3Voltage()
|
|
);
|
|
return mqtt->publish(topic, json);
|
|
} else if(data->getListType() == 3) {
|
|
char json[384];
|
|
snprintf_P(json, sizeof(json), JSON3_JSON,
|
|
WiFi.macAddress().c_str(),
|
|
clientId.c_str(),
|
|
(uint32_t) (millis64()/1000),
|
|
data->getPackageTimestamp(),
|
|
vcc,
|
|
hw->getWifiRssi(),
|
|
hw->getTemperature(),
|
|
data->getListId().c_str(),
|
|
data->getMeterId().c_str(),
|
|
data->getMeterType().c_str(),
|
|
data->getActiveImportPower(),
|
|
data->getReactiveImportPower(),
|
|
data->getActiveExportPower(),
|
|
data->getReactiveExportPower(),
|
|
data->getL1Current(),
|
|
data->getL2Current(),
|
|
data->getL3Current(),
|
|
data->getL1Voltage(),
|
|
data->getL2Voltage(),
|
|
data->getL3Voltage(),
|
|
data->getActiveImportCounter(),
|
|
data->getActiveExportCounter(),
|
|
data->getReactiveImportCounter(),
|
|
data->getReactiveExportCounter(),
|
|
data->getMeterTimestamp()
|
|
);
|
|
return mqtt->publish(topic, json);
|
|
}
|
|
}
|
|
|
|
bool JsonMqttHandler::publishTemperatures(AmsConfiguration* config, HwTools* hw) {
|
|
int count = hw->getTempSensorCount();
|
|
if(count == 0)
|
|
return false;
|
|
|
|
int size = 32 + (count * 26);
|
|
|
|
char buf[size];
|
|
snprintf(buf, 24, "{\"temperatures\":{");
|
|
|
|
for(int i = 0; i < count; i++) {
|
|
TempSensorData* data = hw->getTempSensorData(i);
|
|
TempSensorConfig* conf = config->getTempSensorConfig(data->address);
|
|
char* pos = buf+strlen(buf);
|
|
snprintf(pos, 26, "\"%s\":%.2f,",
|
|
toHex(data->address, 8).c_str(),
|
|
data->lastRead
|
|
);
|
|
data->changed = false;
|
|
delay(1);
|
|
}
|
|
char* pos = buf+strlen(buf);
|
|
snprintf(count == 0 ? pos : pos-1, 8, "}}");
|
|
return mqtt->publish(topic, buf);
|
|
}
|
|
|
|
bool JsonMqttHandler::publishPrices(EntsoeApi* eapi) {
|
|
if(topic.isEmpty() || !mqtt->connected())
|
|
return false;
|
|
if(strcmp(eapi->getToken(), "") != 0)
|
|
return false;
|
|
|
|
time_t now = time(nullptr);
|
|
|
|
float min1hr, min3hr, min6hr;
|
|
uint8_t min1hrIdx = -1, min3hrIdx = -1, min6hrIdx = -1;
|
|
float min = INT16_MAX, max = INT16_MIN;
|
|
float values[24] = {0};
|
|
for(uint8_t i = 0; i < 24; i++) {
|
|
float val = eapi->getValueForHour(now, i);
|
|
values[i] = val;
|
|
|
|
if(val == ENTSOE_NO_VALUE) break;
|
|
|
|
if(val < min) min = val;
|
|
if(val > max) max = val;
|
|
|
|
if(min1hrIdx == -1 || min1hr > val) {
|
|
min1hr = val;
|
|
min1hrIdx = i;
|
|
}
|
|
|
|
if(i >= 2) {
|
|
i -= 2;
|
|
float val1 = values[i++];
|
|
float val2 = values[i++];
|
|
float val3 = val;
|
|
if(val1 == ENTSOE_NO_VALUE || val2 == ENTSOE_NO_VALUE || val3 == ENTSOE_NO_VALUE) continue;
|
|
float val3hr = val1+val2+val3;
|
|
if(min3hrIdx == -1 || min3hr > val3hr) {
|
|
min3hr = val3hr;
|
|
min3hrIdx = i-2;
|
|
}
|
|
}
|
|
|
|
if(i >= 5) {
|
|
i -= 5;
|
|
float val1 = values[i++];
|
|
float val2 = values[i++];
|
|
float val3 = values[i++];
|
|
float val4 = values[i++];
|
|
float val5 = values[i++];
|
|
float val6 = val;
|
|
if(val1 == ENTSOE_NO_VALUE || val2 == ENTSOE_NO_VALUE || val3 == ENTSOE_NO_VALUE || val4 == ENTSOE_NO_VALUE || val5 == ENTSOE_NO_VALUE || val6 == ENTSOE_NO_VALUE) continue;
|
|
float val6hr = val1+val2+val3+val4+val5+val6;
|
|
if(min6hrIdx == -1 || min6hr > val6hr) {
|
|
min6hr = val6hr;
|
|
min6hrIdx = i-5;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
char ts1hr[21];
|
|
if(min1hrIdx != -1) {
|
|
tmElements_t tm;
|
|
breakTime(now + (SECS_PER_HOUR * min1hrIdx), tm);
|
|
sprintf(ts1hr, "%04d-%02d-%02dT%02d:00:00Z", tm.Year+1970, tm.Month, tm.Day, tm.Hour);
|
|
}
|
|
char ts3hr[21];
|
|
if(min3hrIdx != -1) {
|
|
tmElements_t tm;
|
|
breakTime(now + (SECS_PER_HOUR * min3hrIdx), tm);
|
|
sprintf(ts3hr, "%04d-%02d-%02dT%02d:00:00Z", tm.Year+1970, tm.Month, tm.Day, tm.Hour);
|
|
}
|
|
char ts6hr[21];
|
|
if(min6hrIdx != -1) {
|
|
tmElements_t tm;
|
|
breakTime(now + (SECS_PER_HOUR * min6hrIdx), tm);
|
|
sprintf(ts6hr, "%04d-%02d-%02dT%02d:00:00Z", tm.Year+1970, tm.Month, tm.Day, tm.Hour);
|
|
}
|
|
|
|
char json[384];
|
|
snprintf_P(json, sizeof(json), JSONPRICES_JSON,
|
|
WiFi.macAddress().c_str(),
|
|
values[0],
|
|
values[1],
|
|
values[2],
|
|
values[3],
|
|
values[4],
|
|
values[5],
|
|
values[6],
|
|
values[7],
|
|
values[8],
|
|
values[9],
|
|
values[10],
|
|
values[11],
|
|
min == INT16_MAX ? 0.0 : min,
|
|
max == INT16_MIN ? 0.0 : max,
|
|
ts1hr,
|
|
ts3hr,
|
|
ts6hr
|
|
);
|
|
return mqtt->publish(topic, json);
|
|
}
|
|
|
|
bool JsonMqttHandler::publishSystem(HwTools* hw) {
|
|
if(init || topic.isEmpty() || !mqtt->connected())
|
|
return false;
|
|
|
|
char json[192];
|
|
snprintf_P(json, sizeof(json), JSONSYS_JSON,
|
|
WiFi.macAddress().c_str(),
|
|
clientId.c_str(),
|
|
(uint32_t) (millis64()/1000),
|
|
hw->getVcc(),
|
|
hw->getWifiRssi(),
|
|
hw->getTemperature()
|
|
);
|
|
init = mqtt->publish(topic, json);
|
|
return init;
|
|
}
|