Compare commits
No commits in common. "128fadf77d9c3744b430103f283f47cbd87bca4e" and "0381c3c334344b2cac6a57b250425e6edc7a5a6d" have entirely different histories.
128fadf77d
...
0381c3c334
7 changed files with 16 additions and 151 deletions
|
|
@ -14,10 +14,6 @@ class Dtu {
|
||||||
|
|
||||||
std::vector<Microinverter> microinverters;
|
std::vector<Microinverter> microinverters;
|
||||||
|
|
||||||
Port dtuPort;
|
|
||||||
|
|
||||||
int rtuId;
|
|
||||||
|
|
||||||
bool connected;
|
bool connected;
|
||||||
|
|
||||||
void populateMicroinverters();
|
void populateMicroinverters();
|
||||||
|
|
@ -25,8 +21,6 @@ class Dtu {
|
||||||
public:
|
public:
|
||||||
Dtu(const char *address, int id, bool rtu, bool tcp);
|
Dtu(const char *address, int id, bool rtu, bool tcp);
|
||||||
|
|
||||||
Dtu(modbus_t *modbus, int id);
|
|
||||||
|
|
||||||
std::pair<Microinverter *, bool> getMicroinverterBySerialNumber(long long serialNumber);
|
std::pair<Microinverter *, bool> getMicroinverterBySerialNumber(long long serialNumber);
|
||||||
|
|
||||||
bool isConnected();
|
bool isConnected();
|
||||||
|
|
@ -41,15 +35,6 @@ class Dtu {
|
||||||
|
|
||||||
void listOfMicroinverters();
|
void listOfMicroinverters();
|
||||||
|
|
||||||
float getCurrentPower();
|
|
||||||
|
|
||||||
int getCurrentOnOff();
|
|
||||||
|
|
||||||
void turnOffMicroinverters();
|
|
||||||
void turnOnMicroinverters();
|
|
||||||
|
|
||||||
void limitMicroinverters(uint16_t limit);
|
|
||||||
|
|
||||||
~Dtu();
|
~Dtu();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ class Microinverter {
|
||||||
private:
|
private:
|
||||||
modbus_t *modbus;
|
modbus_t *modbus;
|
||||||
|
|
||||||
// Sunspec sunspec;
|
Sunspec sunspec;
|
||||||
|
|
||||||
int startAddress;
|
int startAddress;
|
||||||
|
|
||||||
|
|
@ -43,10 +43,6 @@ class Microinverter {
|
||||||
void setStatus(std::vector<std::pair<int, uint16_t>> portsToSet, std::string statusName);
|
void setStatus(std::vector<std::pair<int, uint16_t>> portsToSet, std::string statusName);
|
||||||
|
|
||||||
void setStatusWholeMicroinverter(uint16_t value, std::string statusName);
|
void setStatusWholeMicroinverter(uint16_t value, std::string statusName);
|
||||||
|
|
||||||
float getCurrentPower();
|
|
||||||
|
|
||||||
int getCurrentOnOff();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -11,8 +11,7 @@
|
||||||
|
|
||||||
#include "portParameters.h"
|
#include "portParameters.h"
|
||||||
|
|
||||||
Dtu::Dtu(const char *address, int id, bool rtu, bool tcp) : dtuPort(0) {
|
Dtu::Dtu(const char *address, int id, bool rtu, bool tcp) {
|
||||||
dtuPort.statusPortStartAddress = 0xd000;
|
|
||||||
if (tcp) {
|
if (tcp) {
|
||||||
this->modbus = modbus_new_tcp(address, id);
|
this->modbus = modbus_new_tcp(address, id);
|
||||||
}
|
}
|
||||||
|
|
@ -23,7 +22,7 @@ Dtu::Dtu(const char *address, int id, bool rtu, bool tcp) : dtuPort(0) {
|
||||||
|
|
||||||
this->connected = false;
|
this->connected = false;
|
||||||
if (modbus_connect(this->modbus) == -1) {
|
if (modbus_connect(this->modbus) == -1) {
|
||||||
std::cerr << "[" << id << "] NOT_CONNECTED" << std::endl;
|
std::cerr << "NOT CONNECTED" << std::endl;
|
||||||
} else {
|
} else {
|
||||||
this->connected = true;
|
this->connected = true;
|
||||||
if (rtu) {
|
if (rtu) {
|
||||||
|
|
@ -33,24 +32,6 @@ Dtu::Dtu(const char *address, int id, bool rtu, bool tcp) : dtuPort(0) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Dtu::Dtu(modbus_t *modbus, int id = -1) : dtuPort(0) {
|
|
||||||
dtuPort.statusPortStartAddress = 0xd000;
|
|
||||||
|
|
||||||
this->modbus = modbus;
|
|
||||||
this->rtuId = id;
|
|
||||||
|
|
||||||
this->connected = false;
|
|
||||||
if (modbus_connect(this->modbus) == -1) {
|
|
||||||
std::cerr << "[" << id << "] NOT_CONNECTED" << std::endl;
|
|
||||||
} else {
|
|
||||||
this->connected = true;
|
|
||||||
if (id != -1) {
|
|
||||||
modbus_set_slave(this->modbus, rtuId);
|
|
||||||
}
|
|
||||||
this->populateMicroinverters();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Dtu::isConnected() { return this->connected; }
|
bool Dtu::isConnected() { return this->connected; }
|
||||||
|
|
||||||
Dtu::~Dtu() {
|
Dtu::~Dtu() {
|
||||||
|
|
@ -59,32 +40,14 @@ Dtu::~Dtu() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Dtu::populateMicroinverters() {
|
void Dtu::populateMicroinverters() {
|
||||||
if(this->rtuId != -1) {
|
|
||||||
modbus_set_slave(this->modbus, this->rtuId);
|
|
||||||
}
|
|
||||||
|
|
||||||
int portStartAddress = 0x4000;
|
int portStartAddress = 0x4000;
|
||||||
int registersToRead{19};
|
uint16_t registers[19];
|
||||||
uint16_t registers[registersToRead];
|
|
||||||
|
|
||||||
bool lastSuccesful{true};
|
|
||||||
|
|
||||||
int addressToSkip{-1};
|
|
||||||
|
|
||||||
while (portStartAddress <= (0x4000 + (0x0019 * 99))) {
|
while (portStartAddress <= (0x4000 + (0x0019 * 99))) {
|
||||||
int registerCount{-1};
|
int registerCount;
|
||||||
int timesTried{0};
|
registerCount = modbus_read_registers(this->modbus, portStartAddress, 19, registers);
|
||||||
while (((timesTried < 3) && (lastSuccesful && registerCount == -1) && portStartAddress != addressToSkip)) {
|
|
||||||
registerCount = modbus_read_registers(this->modbus, portStartAddress, registersToRead, registers);
|
|
||||||
timesTried++;
|
|
||||||
}
|
|
||||||
portStartAddress += 0x0019;
|
portStartAddress += 0x0019;
|
||||||
if ((registers[0] == 12 && registerCount != -1) && portStartAddress != addressToSkip) {
|
if (registers[0] == 12) {
|
||||||
if (!lastSuccesful) {
|
|
||||||
addressToSkip = portStartAddress;
|
|
||||||
portStartAddress -= 2 * 0x0019;
|
|
||||||
}
|
|
||||||
lastSuccesful = true;
|
|
||||||
Port port{portStartAddress};
|
Port port{portStartAddress};
|
||||||
port.setParametersFromMicroinverterArray(registers, 0);
|
port.setParametersFromMicroinverterArray(registers, 0);
|
||||||
|
|
||||||
|
|
@ -93,23 +56,10 @@ void Dtu::populateMicroinverters() {
|
||||||
this->microinverters.push_back(microinverter);
|
this->microinverters.push_back(microinverter);
|
||||||
}
|
}
|
||||||
|
|
||||||
Microinverter *microinverter = this->getMicroinverterBySerialNumber(port.getParameterByName("microinverterSerialNumber").first.get()->getValue().first.i).first;
|
this->getMicroinverterBySerialNumber(port.getParameterByName("microinverterSerialNumber").first.get()->getValue().first.i).first->ports.push_back(port);
|
||||||
std::vector<Port>::iterator portsIterator = microinverter->ports.begin();
|
|
||||||
bool valueExists{false};
|
|
||||||
while (portsIterator != microinverter->ports.end() && !valueExists) {
|
|
||||||
if (portsIterator->getParameterByName("portNumber").first.get()->getValue().first.i == port.getParameterByName("portNumber").first.get()->getValue().first.i) {
|
|
||||||
valueExists = true;
|
|
||||||
}
|
|
||||||
portsIterator++;
|
|
||||||
}
|
|
||||||
if (!valueExists) {
|
|
||||||
microinverter->ports.push_back(port);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
lastSuccesful = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(20));
|
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -126,9 +76,6 @@ std::pair<Microinverter *, bool> Dtu::getMicroinverterBySerialNumber(long long s
|
||||||
}
|
}
|
||||||
|
|
||||||
void Dtu::updateMicroinverters(std::vector<std::string> ¶metersToGet, bool allParameters, std::vector<long long> µinvertersToGet) {
|
void Dtu::updateMicroinverters(std::vector<std::string> ¶metersToGet, bool allParameters, std::vector<long long> µinvertersToGet) {
|
||||||
if(this->rtuId != -1) {
|
|
||||||
modbus_set_slave(this->modbus, this->rtuId);
|
|
||||||
}
|
|
||||||
if (microinvertersToGet.empty()) {
|
if (microinvertersToGet.empty()) {
|
||||||
std::vector<Microinverter>::iterator microinvertersIterator = this->microinverters.begin();
|
std::vector<Microinverter>::iterator microinvertersIterator = this->microinverters.begin();
|
||||||
while (microinvertersIterator != this->microinverters.end()) {
|
while (microinvertersIterator != this->microinverters.end()) {
|
||||||
|
|
@ -208,39 +155,4 @@ void Dtu::listOfMicroinverters() {
|
||||||
std::cout << " " << microinvertersIterator->serialNumber << std::endl;
|
std::cout << " " << microinvertersIterator->serialNumber << std::endl;
|
||||||
microinvertersIterator++;
|
microinvertersIterator++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
float Dtu::getCurrentPower() {
|
|
||||||
std::vector<Microinverter>::iterator microinvertersIterator = this->microinverters.begin();
|
|
||||||
float currentPower{0};
|
|
||||||
while (microinvertersIterator != this->microinverters.end()) {
|
|
||||||
currentPower += microinvertersIterator->getCurrentPower();
|
|
||||||
microinvertersIterator++;
|
|
||||||
}
|
|
||||||
return currentPower;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Dtu::getCurrentOnOff() {
|
|
||||||
if(this->microinverters.size() == 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
std::vector<Microinverter>::iterator microinvertersIterator = this->microinverters.begin();
|
|
||||||
int currentOn{0};
|
|
||||||
while(microinvertersIterator != this->microinverters.end()) {
|
|
||||||
currentOn += microinvertersIterator->getCurrentOnOff();
|
|
||||||
microinvertersIterator++;
|
|
||||||
}
|
|
||||||
float balance = currentOn / this->microinverters.size();
|
|
||||||
if(balance >= 0.5) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Dtu::turnOffMicroinverters() { this->dtuPort.getStatusByName("onOff").first.get()->writeValue(0, this->modbus, this->dtuPort.statusPortStartAddress); }
|
|
||||||
|
|
||||||
void Dtu::turnOnMicroinverters() { this->dtuPort.getStatusByName("onOff").first.get()->writeValue(1, this->modbus, this->dtuPort.statusPortStartAddress); }
|
|
||||||
|
|
||||||
void Dtu::limitMicroinverters(uint16_t limit) { this->dtuPort.getStatusByName("limitActivePower").first.get()->writeValue(limit, this->modbus, this->dtuPort.statusPortStartAddress); }
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
#include "port.h"
|
#include "port.h"
|
||||||
#include "sunspec.h"
|
#include "sunspec.h"
|
||||||
|
|
||||||
Microinverter::Microinverter(modbus_t *modbus, int startAddress, long long serialNumber) {
|
Microinverter::Microinverter(modbus_t *modbus, int startAddress, long long serialNumber) : sunspec(40000, modbus) {
|
||||||
this->modbus = modbus;
|
this->modbus = modbus;
|
||||||
this->startAddress = startAddress;
|
this->startAddress = startAddress;
|
||||||
this->serialNumber = serialNumber;
|
this->serialNumber = serialNumber;
|
||||||
|
|
@ -136,30 +136,4 @@ void Microinverter::setStatusWholeMicroinverter(uint16_t value, std::string stat
|
||||||
this->ports.begin()->getStatusByName(statusName).first.get()->writeValue(value, this->modbus, this->ports.begin()->statusPortStartAddress);
|
this->ports.begin()->getStatusByName(statusName).first.get()->writeValue(value, this->modbus, this->ports.begin()->statusPortStartAddress);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
float Microinverter::getCurrentPower() {
|
|
||||||
std::vector<Port>::iterator portsIterator = this->ports.begin();
|
|
||||||
float currentPower{0};
|
|
||||||
while(portsIterator != this->ports.end()) {
|
|
||||||
currentPower += portsIterator->getParameterByName("pvPower").first.get()->getValue().first.f;
|
|
||||||
portsIterator++;
|
|
||||||
}
|
|
||||||
return currentPower;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Microinverter::getCurrentOnOff() {
|
|
||||||
std::vector<Port>::iterator portsIterator = this->ports.begin();
|
|
||||||
int currentOn{0};
|
|
||||||
while(portsIterator != this->ports.end()) {
|
|
||||||
currentOn += portsIterator->getStatusByName("onOff").first.get()->getValue().first.i;
|
|
||||||
portsIterator++;
|
|
||||||
}
|
|
||||||
float balance = currentOn / this->ports.size();
|
|
||||||
if(balance >= 0.5) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
@ -16,10 +16,10 @@ Sunspec::Sunspec(int address, modbus_t *modbus) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sunspec::setValues() {
|
void Sunspec::setValues() {
|
||||||
uint16_t registers[2];
|
uint16_t registers[70];
|
||||||
|
|
||||||
int registerCount;
|
int registerCount;
|
||||||
registerCount = modbus_read_registers(this->modbus, this->sunspecAddress, 2, registers);
|
registerCount = modbus_read_registers(this->modbus, this->sunspecAddress, 70, registers);
|
||||||
|
|
||||||
std::vector<std::shared_ptr<SunspecParameter>>::iterator parametersIterator = this->parameters.begin();
|
std::vector<std::shared_ptr<SunspecParameter>>::iterator parametersIterator = this->parameters.begin();
|
||||||
while(parametersIterator != this->parameters.end()) {
|
while(parametersIterator != this->parameters.end()) {
|
||||||
|
|
|
||||||
|
|
@ -10,9 +10,7 @@ SunspecParameter::SunspecParameter(std::string name, int registerAddressOffset,
|
||||||
|
|
||||||
void SunspecParameter::getValueFromRegisters(uint16_t *registers, int addressOffset) {}
|
void SunspecParameter::getValueFromRegisters(uint16_t *registers, int addressOffset) {}
|
||||||
|
|
||||||
std::pair<SunspecParameter::SunspecValue, SunspecParameter::SunspecValueType> SunspecParameter::getValue() {
|
std::pair<SunspecParameter::SunspecValue, SunspecParameter::SunspecValueType> SunspecParameter::getValue() {}
|
||||||
return {this->value, this->valueType};
|
|
||||||
}
|
|
||||||
|
|
||||||
SunspecParameterString32::SunspecParameterString32(std::string name, int registerAddressOffset, int registerSize) : SunspecParameter(name, registerAddressOffset, registerSize) {}
|
SunspecParameterString32::SunspecParameterString32(std::string name, int registerAddressOffset, int registerSize) : SunspecParameter(name, registerAddressOffset, registerSize) {}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ int main(int argc, char **argv) {
|
||||||
signal(SIGTERM, sigHandler);
|
signal(SIGTERM, sigHandler);
|
||||||
signal(SIGABRT, sigHandler);
|
signal(SIGABRT, sigHandler);
|
||||||
|
|
||||||
std::string version{"v2.5"};
|
std::string version{"v2.4h"};
|
||||||
std::cout << version << std::endl;
|
std::cout << version << std::endl;
|
||||||
|
|
||||||
CLI::App hoymilesClient{"Client for DTU-Pro/DTU-ProS"};
|
CLI::App hoymilesClient{"Client for DTU-Pro/DTU-ProS"};
|
||||||
|
|
@ -154,4 +154,4 @@ int main(int argc, char **argv) {
|
||||||
void sigHandler(int signal) {
|
void sigHandler(int signal) {
|
||||||
std::cerr << "Interrupted\n";
|
std::cerr << "Interrupted\n";
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue