Release with more helpful help message

This commit is contained in:
TraYali 2024-03-20 19:55:36 +01:00
parent 3b79dc94f4
commit a0d06edf7b
8 changed files with 105 additions and 110 deletions

View file

@ -1,46 +1,31 @@
#ifndef MICROINVERTER_H
#define MICROINVERTER_H
#include <vector>
#include <memory>
#include <string>
// #include <mutex>
#include <vector>
#include "port.h"
#include "modbus.h"
// struct _modbus;
// typedef _modbus modbus_t;
#include "port.h"
class Microinverter {
private:
// std::shared_ptr<modbus_t*> modbus_context;
std::shared_ptr<class modbus> modbus;
// std::mutex *modbus_context_mutex;
public:
Microinverter(
std::shared_ptr<class modbus> modbus, long long serialNumber);
Microinverter(std::shared_ptr<class modbus> modbus, long long serialNumber);
long long serialNumber;
std::vector<Port> ports;
// void updatePorts();
void updatePorts(std::vector<std::string> &parametersToGet, bool allParameters);
void updatePort(int i);
Port getPort(int i);
// void printPorts();
void printPorts(std::vector<std::string> &parametersToGet, bool allParameters);
long long getTodayProduction();
long long getTotalProduction();
};
#endif

View file

@ -16,8 +16,6 @@ class Port {
void populateParameters();
std::pair<std::shared_ptr<PortParameter>, bool> getParameterByName(std::string name);
void fixCurrent();
bool currentFixed;
@ -26,12 +24,10 @@ class Port {
std::vector<std::shared_ptr<PortParameter>> parameters;
// void updateParameters();
std::pair<std::shared_ptr<PortParameter>, bool> getParameterByName(std::string name);
void updateParameters(std::vector<std::string> &parametersToGet, bool allParameters);
// void printParameters();
void printParameters(std::vector<std::string> &parametersToGet, bool allParameters);
};

View file

@ -4,84 +4,84 @@
#include "portParametersGeneric.h"
class PortParameterMicroinverterSerialNumber : public PortParameterInt {
protected:
void setValueFromRegisters(uint16_t *readArray, int registerCount);
private:
void setValueFromRegisters(uint16_t *readArray, int registerCount);
public:
PortParameterMicroinverterSerialNumber();
PortParameterMicroinverterSerialNumber();
};
class PortParameterPortNumber : public PortParameterInt {
private:
void setValueFromRegisters(uint16_t *readArray, int registerCount);
void setValueFromRegisters(uint16_t *readArray, int registerCount);
public:
PortParameterPortNumber();
PortParameterPortNumber();
};
class PortParameterPvVoltage : public PortParameterFloat {
public:
PortParameterPvVoltage();
PortParameterPvVoltage();
};
class PortParameterPvCurrentMi : public PortParameterFloat {
public:
PortParameterPvCurrentMi();
PortParameterPvCurrentMi();
};
class PortParameterPvCurrentHm : public PortParameterFloat {
public:
PortParameterPvCurrentHm();
PortParameterPvCurrentHm();
};
class PortParameterGridVoltage : public PortParameterFloat {
public:
PortParameterGridVoltage();
PortParameterGridVoltage();
};
class PortParameterGridFrequency : public PortParameterFloat {
public:
PortParameterGridFrequency();
PortParameterGridFrequency();
};
class PortParameterPvPower : public PortParameterFloat {
public:
PortParameterPvPower();
PortParameterPvPower();
};
class PortParameterTodayProduction : public PortParameterInt {
public:
PortParameterTodayProduction();
PortParameterTodayProduction();
};
class PortParameterTotalProduction : public PortParameterInt {
public:
PortParameterTotalProduction();
PortParameterTotalProduction();
};
class PortParameterTemperature : public PortParameterFloat {
public:
PortParameterTemperature();
PortParameterTemperature();
};
class PortParameterOperatingStatus : public PortParameterInt {
public:
PortParameterOperatingStatus();
PortParameterOperatingStatus();
};
class PortParameterAlarmCode : public PortParameterInt {
public:
PortParameterAlarmCode();
PortParameterAlarmCode();
};
class PortParameterAlarmCount : public PortParameterInt {
public:
PortParameterAlarmCount();
PortParameterAlarmCount();
};
class PortParameterLinkStatus : public PortParameterInt {
public:
PortParameterLinkStatus();
PortParameterLinkStatus();
};
#endif

View file

@ -1,10 +1,9 @@
#ifndef PORTPARAMETERSGENERIC_H
#define PORTPARAMETERSGENERIC_H
#include <memory>
#include <stdint.h>
#include <string>
#include <memory>
// #include <mutex>
struct _modbus;
typedef _modbus modbus_t;
@ -29,7 +28,7 @@ class PortParameter {
};
protected:
PortParameterValueType valueType;
PortParameterValueType valueType;
PortParameterValue value;
public:
@ -45,21 +44,21 @@ class PortParameter {
class PortParameterFloat : virtual public PortParameter {
protected:
int decimalPlaces;
int decimalPlaces;
virtual void setValueFromRegisters(uint16_t *readArray, int registerCount);
virtual void setValueFromRegisters(uint16_t *readArray, int registerCount);
public:
public:
PortParameterFloat(std::string name, int decimalPlaces, uint16_t parameterAddressOffset, int registerSize);
std::string getOutputValue();
};
class PortParameterInt : virtual public PortParameter {
protected:
protected:
virtual void setValueFromRegisters(uint16_t *readArray, int registerCount);
public:
public:
PortParameterInt(std::string name, uint16_t parameterAddressOffset, int registerSize);
std::string getOutputValue();

View file

@ -1,6 +1,6 @@
#include <vector>
#include <iostream>
#include <string>
#include <vector>
#include "modbus.h"
@ -9,31 +9,27 @@
#include "portParameters.h"
Dtu::Dtu(const char *ip_address, int port) {
class modbus modbus{ip_address, (uint16_t) port};
class modbus modbus {
ip_address, (uint16_t)port
};
this->modbus = std::make_shared<class modbus>(modbus);
if (!this->modbus.get()->modbus_connect()) {
std::cerr << "conn_error" << std::endl;
this->connected = false;
}
else {
} else {
this->connected = true;
}
if(this->connected) {
if (this->connected) {
this->populateMicroinverters();
}
}
bool Dtu::isConnected() {
return this->connected;
}
bool Dtu::isConnected() { return this->connected; }
Dtu::~Dtu() {
this->modbus.get()->modbus_close();
}
Dtu::~Dtu() { this->modbus.get()->modbus_close(); }
void Dtu::populateMicroinverters() {
uint16_t portStartAddress = 0x1000;
@ -41,19 +37,18 @@ void Dtu::populateMicroinverters() {
int registerCount;
registerCount = this->modbus.get()->modbus_read_holding_registers(portStartAddress + 0x0021, 1, readArray);
while(registerCount != -1 && readArray[0] == 0x700) {
Port port{ this->modbus, portStartAddress };
while (registerCount != -1 && readArray[0] == 0x700) {
Port port{this->modbus, portStartAddress};
PortParameterMicroinverterSerialNumber portParameterMicroinverterSerialNumber{};
portParameterMicroinverterSerialNumber.updateValue(this->modbus, portStartAddress);
long long serialNumber = portParameterMicroinverterSerialNumber.getValue().first.i;
std::pair<bool, Microinverter*> getMicroinverterBySerialNumber = this->getMicroinverterBySerialNumber(serialNumber);
if(getMicroinverterBySerialNumber.first) {
std::pair<bool, Microinverter *> getMicroinverterBySerialNumber = this->getMicroinverterBySerialNumber(serialNumber);
if (getMicroinverterBySerialNumber.first) {
getMicroinverterBySerialNumber.second->ports.push_back(port);
}
else {
Microinverter microinverter{ this->modbus, serialNumber };
} else {
Microinverter microinverter{this->modbus, serialNumber};
this->microinverters.push_back(microinverter);
this->microinverters.back().ports.push_back(port);
}
@ -64,32 +59,31 @@ void Dtu::populateMicroinverters() {
}
}
std::pair<bool, Microinverter*> Dtu::getMicroinverterBySerialNumber(long long serialNumber) {
std::pair<bool, Microinverter *> Dtu::getMicroinverterBySerialNumber(long long serialNumber) {
std::vector<Microinverter>::iterator microinvertersIterator = this->microinverters.begin();
while(microinvertersIterator != this->microinverters.end()) {
if(microinvertersIterator->serialNumber == serialNumber) {
return std::pair<bool, Microinverter*>(true, &*microinvertersIterator);
}
else{
while (microinvertersIterator != this->microinverters.end()) {
if (microinvertersIterator->serialNumber == serialNumber) {
return std::pair<bool, Microinverter *>(true, &*microinvertersIterator);
} else {
microinvertersIterator++;
}
}
return std::pair<bool, Microinverter*>(false, &*microinvertersIterator);
return std::pair<bool, Microinverter *>(false, &*microinvertersIterator);
}
void Dtu::updateMicroinverters(std::vector<std::string> &parametersToGet, bool allParameters, std::vector<long long> &microinvertersToGet) {
if(microinvertersToGet.empty()) {
if (microinvertersToGet.empty()) {
std::vector<Microinverter>::iterator microinvertersIterator = this->microinverters.begin();
while(microinvertersIterator != this->microinverters.end()) {
while (microinvertersIterator != this->microinverters.end()) {
microinvertersToGet.push_back(microinvertersIterator->serialNumber);
microinvertersIterator++;
}
}
std::vector<long long>::iterator microinvertersToGetIterator = microinvertersToGet.begin();
while(microinvertersToGetIterator != microinvertersToGet.end()) {
std::pair<bool, Microinverter*> microinverterPair = this->getMicroinverterBySerialNumber(*microinvertersToGetIterator);
if(microinverterPair.first) {
while (microinvertersToGetIterator != microinvertersToGet.end()) {
std::pair<bool, Microinverter *> microinverterPair = this->getMicroinverterBySerialNumber(*microinvertersToGetIterator);
if (microinverterPair.first) {
microinverterPair.second->updatePorts(parametersToGet, allParameters);
}
microinvertersToGetIterator++;
@ -97,18 +91,18 @@ void Dtu::updateMicroinverters(std::vector<std::string> &parametersToGet, bool a
}
void Dtu::printMicroinverters(std::vector<std::string> &parametersToGet, bool allParameters, std::vector<long long> &microinvertersToGet) {
if(microinvertersToGet.empty()) {
if (microinvertersToGet.empty()) {
std::vector<Microinverter>::iterator microinvertersIterator = this->microinverters.begin();
while(microinvertersIterator != this->microinverters.end()) {
while (microinvertersIterator != this->microinverters.end()) {
microinvertersToGet.push_back(microinvertersIterator->serialNumber);
microinvertersIterator++;
}
}
std::vector<long long>::iterator microinvertersToGetIterator = microinvertersToGet.begin();
while(microinvertersToGetIterator != microinvertersToGet.end()) {
std::pair<bool, Microinverter*> microinverterPair = this->getMicroinverterBySerialNumber(*microinvertersToGetIterator);
if(microinverterPair.first) {
while (microinvertersToGetIterator != microinvertersToGet.end()) {
std::pair<bool, Microinverter *> microinverterPair = this->getMicroinverterBySerialNumber(*microinvertersToGetIterator);
if (microinverterPair.first) {
microinverterPair.second->printPorts(parametersToGet, allParameters);
}
microinvertersToGetIterator++;

View file

@ -1,4 +1,3 @@
// #include <thread>
#include <iostream>
#include <memory>
#include <string>
@ -10,14 +9,12 @@
Microinverter::Microinverter(std::shared_ptr<class modbus> modbus, long long serialNumber) {
this->modbus = modbus;
// this->modbus_context_mutex = modbus_context_mutex;
this->serialNumber = serialNumber;
}
void Microinverter::updatePorts(std::vector<std::string> &parametersToGet, bool allParameters) {
std::vector<Port>::iterator portsIterator = this->ports.begin();
while(portsIterator != this->ports.end()) {
while (portsIterator != this->ports.end()) {
portsIterator->updateParameters(parametersToGet, allParameters);
portsIterator++;
}
@ -27,9 +24,33 @@ void Microinverter::printPorts(std::vector<std::string> &parametersToGet, bool a
std::cout << "Microinverter: " << this->serialNumber << std::endl;
std::vector<Port>::iterator portsIterator = this->ports.begin();
while(portsIterator != this->ports.end()) {
while (portsIterator != this->ports.end()) {
portsIterator->printParameters(parametersToGet, allParameters);
std::cout << std::endl;
portsIterator++;
}
}
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->getValue().first.i;
portsIterator++;
}
return result;
}
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->getValue().first.i;
portsIterator++;
}
return result;
}

View file

@ -77,10 +77,9 @@ void Port::fixCurrent() {
if (this->getParameterByName("pvVoltage").second && this->getParameterByName("pvPower").second) {
if (this->getParameterByName("pvCurrentMI").second && this->getParameterByName("pvCurrentHM").second) {
if(this->getParameterByName("pvPower").first->getValue().first.f > this->getParameterByName("pvVoltage").first->getValue().first.f * this->getParameterByName("pvCurrentMI").first->getValue().first.f) {
if (this->getParameterByName("pvPower").first->getValue().first.f > this->getParameterByName("pvVoltage").first->getValue().first.f * this->getParameterByName("pvCurrentMI").first->getValue().first.f) {
this->parameters.erase(std::find(this->parameters.begin(), this->parameters.end(), this->getParameterByName("pvCurrentHM").first));
}
else {
} else {
this->parameters.erase(std::find(this->parameters.begin(), this->parameters.end(), this->getParameterByName("pvCurrentM").first));
}
this->currentFixed = true;

View file

@ -19,34 +19,35 @@ int main(int argc, char **argv) {
signal(SIGTERM, sigHandler);
signal(SIGABRT, sigHandler);
std::string version{"v1.0a"};
std::string version{"v1.0h"};
std::cout << version << std::endl;
CLI::App hoymilesClient{"Client for DTU-Pro/DTU-ProS"};
std::string ipAddress{"127.0.0.1"};
std::string ipAddressHelp{"ipv4 address of DTU {default: " + ipAddress + "}"};
hoymilesClient.add_option<std::string>("-i,--ip_address", ipAddress, ipAddressHelp)->required();
hoymilesClient.add_option<std::string>("-i,--ip_address", ipAddress, ipAddressHelp)->required()->group("Networking");
int port{502};
std::string portHelp{"Port of DTU {default: " + std::to_string(port) + "}"};
hoymilesClient.add_option<int>("-p,--port", port, portHelp);
hoymilesClient.add_option<int>("-p,--port", port, portHelp)->group("Networking");
std::vector<std::string> parametersToGet{};
std::string parametersToGetHelp{"List of parameters to fetch, delimited by ',', example[par1,par2,par3]"};
hoymilesClient.add_option<std::vector<std::string>>("-P,--parameters", parametersToGet, parametersToGetHelp)->delimiter(',');
std::string parametersToGetHelp{"List of parameters to fetch, delimited by ','; possible parameters:\n - pvVoltage\n - pvCurrentMI\n - pvCurrentHM\n - gridVoltage\n - gridFrequency\n - pvPower\n - todayProduction\n - totalProduction\n - temperature\n - operatingStatus\n - alarmCode\n - alarmCount\n - linkStatus"};
hoymilesClient.add_option<std::vector<std::string>>("-P,--parameters", parametersToGet, parametersToGetHelp)->delimiter(',')->group("Parameters");
bool allParameters = false;
std::string allParametersHelp{"Fetch all parameters"};
hoymilesClient.add_flag<bool>("-a,--all_parameters", allParameters, allParametersHelp);
hoymilesClient.add_flag<bool>("-a,--all_parameters", allParameters, allParametersHelp)->group("Parameters");
bool ignoreNotConnected = false;
std::string ignoreNotConnectedHelp{"Ignore connection errors"};
hoymilesClient.add_flag<bool>("-I,--ignore_conn_error", ignoreNotConnected, ignoreNotConnectedHelp);
std::vector<long long> microinvertersToGet{};
std::string microinvertersToGetHelp{"List of microinverters to fetch, if omitted all are fetched, delimited by ','"};
hoymilesClient.add_option<std::vector<long long>>("-m,--microinverters", microinvertersToGet, microinvertersToGetHelp)->delimiter(',');
std::string microinvertersToGetHelp{"List of microinverters to fetch, delimited by ','; if omitted, all are fetched"};
hoymilesClient.add_option<std::vector<long long>>("-m,--microinverters", microinvertersToGet, microinvertersToGetHelp)->delimiter(',')->group("Microinverters");
bool ignoreNotConnected = false;
std::string ignoreNotConnectedHelp{"Ignore conn_error"};
hoymilesClient.add_flag<bool>("-I,--ignore_conn_error", ignoreNotConnected, ignoreNotConnectedHelp)->group("Debug");
try {
hoymilesClient.parse(argc, argv);