hoymilesClient/src/hoymiles/microinverter.cpp

84 lines
2.5 KiB
C++
Raw Normal View History

#include <iostream>
#include <memory>
2024-03-20 11:28:43 +01:00
#include <string>
#include "modbus.h"
2024-03-16 21:15:15 +01:00
#include "microinverter.h"
#include "port.h"
2024-03-29 21:40:50 +01:00
#include "sunspec.h"
2024-03-16 21:15:15 +01:00
2024-03-29 21:40:50 +01:00
Microinverter::Microinverter(std::shared_ptr<class modbus> modbus, int startAddress, long long serialNumber) : sunspec(40000, modbus) {
2024-03-19 18:13:27 +01:00
this->modbus = modbus;
this->startAddress = startAddress;
this->serialNumber = serialNumber;
this->age = 0;
2024-03-16 21:15:15 +01:00
}
// void Microinverter::updatePorts(std::vector<std::string> &parametersToGet, bool allParameters) {
// int registersToRead = (this->ports.size() * 40) / 2;
// uint16_t registersJoined[registersToRead];
// int registerCount = this->modbus.get()->modbus_read_holding_registers(this->startAddress, registersToRead, registersJoined);
// }
void Microinverter::updateParameters(std::vector<std::string> &parametersToGet, bool allParameters) {
int portsRead = 0;
while (portsRead < this->ports.size()) {
int portsToRead = 0;
while (portsToRead * 0x0019 < (128 - 0x0019) && (portsToRead + portsRead) < this->ports.size()) {
portsToRead++;
}
int registersToRead = (portsToRead * 0x0019);
uint16_t registers[registersToRead];
int registerCount;
registerCount = this->modbus.get()->modbus_read_holding_registers(this->startAddress + (portsRead * 0x0019), registersToRead, registers);
if (registerCount != 0) {
this->age++;
return;
}
for (int i{0}; i < portsToRead; i++) {
this->ports.at(i).setParametersFromMicroinverterArray(registers, i * 0x0019);
}
portsRead += portsToRead;
}
2024-03-20 11:28:43 +01:00
}
2024-03-20 20:17:15 +01:00
void Microinverter::printPorts(std::vector<std::string> &parametersToGet, bool allParameters, bool shortNames) {
2024-03-20 11:28:43 +01:00
std::vector<Port>::iterator portsIterator = this->ports.begin();
2024-03-20 19:55:36 +01:00
while (portsIterator != this->ports.end()) {
2024-03-20 20:17:15 +01:00
portsIterator->printParameters(parametersToGet, allParameters, shortNames);
2024-03-20 11:28:43 +01:00
std::cout << std::endl;
portsIterator++;
}
2024-03-20 19:55:36 +01:00
}
long long Microinverter::getTodayProduction() {
long long result{0};
std::vector<Port>::iterator portsIterator = this->ports.begin();
while (portsIterator != this->ports.end()) {
result += portsIterator->getParameterByName("todayProduction").first.get()->getValue().first.i;
2024-03-20 19:55:36 +01:00
portsIterator++;
}
return result;
2024-03-20 19:55:36 +01:00
}
long long Microinverter::getTotalProduction() {
long long result{0};
std::vector<Port>::iterator portsIterator = this->ports.begin();
while (portsIterator != this->ports.end()) {
result += portsIterator->getParameterByName("totalProduction").first.get()->getValue().first.i;
portsIterator++;
2024-03-20 19:55:36 +01:00
}
return result;
2024-03-16 21:15:15 +01:00
}