hoymilesClient/src/hoymiles/port.cpp

138 lines
4.5 KiB
C++
Raw Normal View History

#include <vector>
#include <string>
#include <iostream>
#include <cmath>
#include <algorithm>
2024-03-16 21:15:15 +01:00
#include "modbus.h"
#include "port.h"
#include "portParameters.h"
2024-03-16 21:15:15 +01:00
2024-03-19 18:13:27 +01:00
Port::Port(std::shared_ptr<class modbus> modbus, uint16_t portStartAddress) {
this->modbus = modbus;
2024-03-16 21:15:15 +01:00
this->portStartAddress = portStartAddress;
2024-03-19 09:22:21 +01:00
this->currentFixed = false;
2024-03-16 21:15:15 +01:00
this->populateParameters();
}
void Port::populateParameters() {
this->parameters.push_back(std::make_shared<PortParameterMicroinverterSerialNumber>());
2024-03-16 21:15:15 +01:00
this->parameters.push_back(std::make_shared<PortParameterPortNumber>());
2024-03-16 21:15:15 +01:00
this->parameters.push_back(std::make_shared<PortParameterPvVoltage>());
2024-03-16 21:15:15 +01:00
this->parameters.push_back(std::make_shared<PortParameterPvCurrentMi>());
2024-03-16 21:15:15 +01:00
this->parameters.push_back(std::make_shared<PortParameterPvCurrentHm>());
2024-03-16 21:15:15 +01:00
this->parameters.push_back(std::make_shared<PortParameterGridVoltage>());
2024-03-16 21:15:15 +01:00
this->parameters.push_back(std::make_shared<PortParameterGridFrequency>());
2024-03-16 21:15:15 +01:00
this->parameters.push_back(std::make_shared<PortParameterPvPower>());
2024-03-16 21:15:15 +01:00
this->parameters.push_back(std::make_shared<PortParameterTodayProduction>());
2024-03-16 21:15:15 +01:00
this->parameters.push_back(std::make_shared<PortParameterTotalProduction>());
2024-03-16 21:15:15 +01:00
this->parameters.push_back(std::make_shared<PortParameterTemperature>());
2024-03-16 21:15:15 +01:00
this->parameters.push_back(std::make_shared<PortParameterOperatingStatus>());
2024-03-16 21:15:15 +01:00
this->parameters.push_back(std::make_shared<PortParameterAlarmCode>());
2024-03-16 21:15:15 +01:00
this->parameters.push_back(std::make_shared<PortParameterAlarmCount>());
this->parameters.push_back(std::make_shared<PortParameterLinkStatus>());
2024-03-16 21:15:15 +01:00
}
2024-03-20 11:28:43 +01:00
std::pair<std::shared_ptr<PortParameter>, bool> Port::getParameterByName(std::string name) {
std::pair<std::shared_ptr<PortParameter>, bool> result;
result.second = false;
std::vector<std::shared_ptr<PortParameter>>::iterator parametersIterator = this->parameters.begin();
while(parametersIterator != this->parameters.end() && !result.second) {
if(parametersIterator->get()->name == name) {
result.first = *parametersIterator;
result.second = true;
}
parametersIterator++;
2024-03-20 11:28:43 +01:00
}
return result;
}
2024-03-19 09:22:21 +01:00
void Port::fixCurrent() {
if(this->currentFixed) {
return;
}
2024-03-19 20:48:19 +01:00
if(this->parameters.size() < 8) {
return;
}
2024-03-19 09:22:21 +01:00
if(this->parameters.at(7).get()->getValue().first.f == 0) {
return;
}
if(this->parameters.at(2).get()->getValue().first.f * this->parameters.at(4).get()->getValue().first.f < this->parameters.at(7).get()->getValue().first.f) {
this->parameters.erase(this->parameters.begin() + 4);
}
else {
this->parameters.erase(this->parameters.begin() + 3);
}
this->currentFixed = true;
}
void Port::updateParameters(std::vector<std::string> &parametersToGet, bool allParameters) {
if(allParameters && parametersToGet.size() < this->parameters.size()) {
std::vector<std::shared_ptr<PortParameter>>::iterator parametersIterator = this->parameters.begin();
while(parametersIterator != this->parameters.end()) {
if(std::find(parametersToGet.begin(), parametersToGet.end(), parametersIterator->get()->name) == parametersToGet.end()) {
parametersToGet.push_back(parametersIterator->get()->name);
}
parametersIterator++;
}
}
2024-03-20 11:28:43 +01:00
std::vector<std::string>::iterator parametersToGetIterator = parametersToGet.begin();
while(parametersToGetIterator != parametersToGet.end()) {
std::pair<std::shared_ptr<PortParameter>, bool> parameterPair;
parameterPair = this->getParameterByName(*parametersToGetIterator);
if(parameterPair.second) {
parameterPair.first->updateValue(this->modbus, this->portStartAddress);
}
parametersToGetIterator++;
}
}
void Port::printParameters(std::vector<std::string> &parametersToGet, bool allParameters) {
if(allParameters && parametersToGet.size() < this->parameters.size()) {
std::vector<std::shared_ptr<PortParameter>>::iterator parametersIterator = this->parameters.begin();
while(parametersIterator != this->parameters.end()) {
if(std::find(parametersToGet.begin(), parametersToGet.end(), parametersIterator->get()->name) != parametersToGet.end()) {
parametersToGet.push_back(parametersIterator->get()->name);
}
parametersIterator++;
}
}
2024-03-20 11:28:43 +01:00
std::vector<std::string>::iterator parametersToGetIterator = parametersToGet.begin();
if(parametersToGetIterator != parametersToGet.end()) {
std::cout << "|";
}
while(parametersToGetIterator != parametersToGet.end()) {
std::pair<std::shared_ptr<PortParameter>, bool> parameterPair;
parameterPair = this->getParameterByName(*parametersToGetIterator);
if(parameterPair.second) {
std::cout << " " << parameterPair.first->name << ": " << parameterPair.first->getOutputValue() << " |";
}
parametersToGetIterator++;
2024-03-20 11:28:43 +01:00
}
2024-03-16 21:15:15 +01:00
}