copy vedirect data if send only
updated data is true
This commit is contained in:
parent
43bfee4d55
commit
7022ed95b6
@ -27,6 +27,7 @@ void MqttHandleVedirectClass::loop()
|
||||
String serial;
|
||||
auto pos = VeDirect.veMap.find("SER");
|
||||
if (pos == VeDirect.veMap.end()) {
|
||||
MessageOutput.printf("No VeDirect Data\r\n");
|
||||
return;
|
||||
}
|
||||
else {
|
||||
@ -34,62 +35,71 @@ void MqttHandleVedirectClass::loop()
|
||||
}
|
||||
|
||||
if (millis() - _lastPublish > (config.Mqtt_PublishInterval * 1000)) {
|
||||
if (millis() - VeDirect.getLastUpdate() > (config.Vedirect_PollInterval * 3 * 1000)) {
|
||||
MessageOutput.printf("VeDirect Data too old: Stopping publishing. Last read before %f seconds\r\n", (millis() - VeDirect.getLastUpdate()) / 1000.0);
|
||||
if ((millis() - VeDirect.getLastUpdate()) / 1000 > config.Vedirect_PollInterval * 5) { // same as age critical in live view
|
||||
MessageOutput.printf("VeDirect Data too old: Stopping publishing. Last read before %lu seconds\r\n", (millis() - VeDirect.getLastUpdate()) / 1000);
|
||||
return;
|
||||
}
|
||||
|
||||
String key;
|
||||
String value;
|
||||
bool bChanged;
|
||||
String mapedValue;
|
||||
bool bChanged = false;
|
||||
|
||||
String topic = "";
|
||||
for (auto it = VeDirect.veMap.begin(); it != VeDirect.veMap.end(); ++it) {
|
||||
key = it->first;
|
||||
value = it->second;
|
||||
|
||||
// Mark changed values
|
||||
auto a = _kv_map.find(key);
|
||||
bChanged = true;
|
||||
if (a != _kv_map.end()) {
|
||||
if (_kv_map[key] == value) {
|
||||
bChanged = false;
|
||||
}
|
||||
if (config.Vedirect_UpdatesOnly){
|
||||
// Mark changed values
|
||||
auto a = _kv_map.find(key);
|
||||
bChanged = true;
|
||||
if (a != _kv_map.end()) {
|
||||
if (a->first.equals(value)) {
|
||||
bChanged = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// publish only changed key, values pairs
|
||||
if (!config.Vedirect_UpdatesOnly || (bChanged && config.Vedirect_UpdatesOnly)) {
|
||||
topic = "victron/" + serial + "/";
|
||||
topic.concat(key);
|
||||
if (key.equals("PID")) {
|
||||
value = VeDirect.getPidAsString(value.c_str());
|
||||
mapedValue = VeDirect.getPidAsString(value.c_str());
|
||||
}
|
||||
else if (key.equals("CS")) {
|
||||
value = VeDirect.getCsAsString(value.c_str());
|
||||
mapedValue = VeDirect.getCsAsString(value.c_str());
|
||||
}
|
||||
else if (key.equals("ERR")) {
|
||||
value = VeDirect.getErrAsString(value.c_str());
|
||||
mapedValue = VeDirect.getErrAsString(value.c_str());
|
||||
}
|
||||
else if (key.equals("OR")) {
|
||||
value = VeDirect.getOrAsString(value.c_str());
|
||||
mapedValue = VeDirect.getOrAsString(value.c_str());
|
||||
}
|
||||
else if (key.equals("MPPT")) {
|
||||
value = VeDirect.getMpptAsString(value.c_str());
|
||||
mapedValue = VeDirect.getMpptAsString(value.c_str());
|
||||
}
|
||||
else if (key.equals("V") ||
|
||||
key.equals("I") ||
|
||||
key.equals("VPV")) {
|
||||
value = round(value.toDouble() / 10.0) / 100.0;
|
||||
mapedValue = round(value.toDouble() / 10.0) / 100.0;
|
||||
}
|
||||
else if (key.equals("H19") ||
|
||||
key.equals("H20") ||
|
||||
key.equals("H22")) {
|
||||
value = value.toDouble() / 100.0;
|
||||
mapedValue = value.toDouble() / 100.0;
|
||||
}
|
||||
MqttSettings.publish(topic.c_str(), value.c_str());
|
||||
else {
|
||||
mapedValue = value;
|
||||
}
|
||||
MqttSettings.publish(topic.c_str(), mapedValue.c_str());
|
||||
}
|
||||
}
|
||||
_kv_map = VeDirect.veMap;
|
||||
if (config.Vedirect_UpdatesOnly){
|
||||
_kv_map = VeDirect.veMap;
|
||||
}
|
||||
_lastPublish = millis();
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user