diff --git a/inc/hoymiles/microinverter.h b/inc/hoymiles/microinverter.h index 3927fd0..12f10fa 100644 --- a/inc/hoymiles/microinverter.h +++ b/inc/hoymiles/microinverter.h @@ -1,46 +1,31 @@ #ifndef MICROINVERTER_H #define MICROINVERTER_H -#include #include #include -// #include +#include -#include "port.h" #include "modbus.h" - -// struct _modbus; -// typedef _modbus modbus_t; +#include "port.h" class Microinverter { private: - // std::shared_ptr modbus_context; - std::shared_ptr modbus; - // std::mutex *modbus_context_mutex; - - - public: - Microinverter( - std::shared_ptr modbus, long long serialNumber); + Microinverter(std::shared_ptr modbus, long long serialNumber); long long serialNumber; std::vector ports; - // void updatePorts(); - void updatePorts(std::vector ¶metersToGet, bool allParameters); - void updatePort(int i); - - Port getPort(int i); - - // void printPorts(); - void printPorts(std::vector ¶metersToGet, bool allParameters); + + long long getTodayProduction(); + + long long getTotalProduction(); }; #endif \ No newline at end of file diff --git a/inc/hoymiles/port.h b/inc/hoymiles/port.h index 3f32d25..dbdb50b 100644 --- a/inc/hoymiles/port.h +++ b/inc/hoymiles/port.h @@ -16,8 +16,6 @@ class Port { void populateParameters(); - std::pair, bool> getParameterByName(std::string name); - void fixCurrent(); bool currentFixed; @@ -26,12 +24,10 @@ class Port { std::vector> parameters; - // void updateParameters(); + std::pair, bool> getParameterByName(std::string name); void updateParameters(std::vector ¶metersToGet, bool allParameters); - // void printParameters(); - void printParameters(std::vector ¶metersToGet, bool allParameters); }; diff --git a/inc/hoymiles/portParameters/portParameters.h b/inc/hoymiles/portParameters/portParameters.h index 83dcd85..3db6fbe 100644 --- a/inc/hoymiles/portParameters/portParameters.h +++ b/inc/hoymiles/portParameters/portParameters.h @@ -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 \ No newline at end of file diff --git a/inc/hoymiles/portParameters/portParametersGeneric.h b/inc/hoymiles/portParameters/portParametersGeneric.h index 23ed5a0..beae85a 100644 --- a/inc/hoymiles/portParameters/portParametersGeneric.h +++ b/inc/hoymiles/portParameters/portParametersGeneric.h @@ -1,10 +1,9 @@ #ifndef PORTPARAMETERSGENERIC_H #define PORTPARAMETERSGENERIC_H +#include #include #include -#include -// #include 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(); diff --git a/src/hoymiles/dtu.cpp b/src/hoymiles/dtu.cpp index 0127a31..f980262 100644 --- a/src/hoymiles/dtu.cpp +++ b/src/hoymiles/dtu.cpp @@ -1,6 +1,6 @@ -#include #include #include +#include #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(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 getMicroinverterBySerialNumber = this->getMicroinverterBySerialNumber(serialNumber); - if(getMicroinverterBySerialNumber.first) { + std::pair 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 Dtu::getMicroinverterBySerialNumber(long long serialNumber) { +std::pair Dtu::getMicroinverterBySerialNumber(long long serialNumber) { std::vector::iterator microinvertersIterator = this->microinverters.begin(); - while(microinvertersIterator != this->microinverters.end()) { - if(microinvertersIterator->serialNumber == serialNumber) { - return std::pair(true, &*microinvertersIterator); - } - else{ + while (microinvertersIterator != this->microinverters.end()) { + if (microinvertersIterator->serialNumber == serialNumber) { + return std::pair(true, &*microinvertersIterator); + } else { microinvertersIterator++; } } - return std::pair(false, &*microinvertersIterator); + return std::pair(false, &*microinvertersIterator); } void Dtu::updateMicroinverters(std::vector ¶metersToGet, bool allParameters, std::vector µinvertersToGet) { - if(microinvertersToGet.empty()) { + if (microinvertersToGet.empty()) { std::vector::iterator microinvertersIterator = this->microinverters.begin(); - while(microinvertersIterator != this->microinverters.end()) { + while (microinvertersIterator != this->microinverters.end()) { microinvertersToGet.push_back(microinvertersIterator->serialNumber); microinvertersIterator++; } } std::vector::iterator microinvertersToGetIterator = microinvertersToGet.begin(); - while(microinvertersToGetIterator != microinvertersToGet.end()) { - std::pair microinverterPair = this->getMicroinverterBySerialNumber(*microinvertersToGetIterator); - if(microinverterPair.first) { + while (microinvertersToGetIterator != microinvertersToGet.end()) { + std::pair microinverterPair = this->getMicroinverterBySerialNumber(*microinvertersToGetIterator); + if (microinverterPair.first) { microinverterPair.second->updatePorts(parametersToGet, allParameters); } microinvertersToGetIterator++; @@ -97,18 +91,18 @@ void Dtu::updateMicroinverters(std::vector ¶metersToGet, bool a } void Dtu::printMicroinverters(std::vector ¶metersToGet, bool allParameters, std::vector µinvertersToGet) { - if(microinvertersToGet.empty()) { + if (microinvertersToGet.empty()) { std::vector::iterator microinvertersIterator = this->microinverters.begin(); - while(microinvertersIterator != this->microinverters.end()) { + while (microinvertersIterator != this->microinverters.end()) { microinvertersToGet.push_back(microinvertersIterator->serialNumber); microinvertersIterator++; } } std::vector::iterator microinvertersToGetIterator = microinvertersToGet.begin(); - while(microinvertersToGetIterator != microinvertersToGet.end()) { - std::pair microinverterPair = this->getMicroinverterBySerialNumber(*microinvertersToGetIterator); - if(microinverterPair.first) { + while (microinvertersToGetIterator != microinvertersToGet.end()) { + std::pair microinverterPair = this->getMicroinverterBySerialNumber(*microinvertersToGetIterator); + if (microinverterPair.first) { microinverterPair.second->printPorts(parametersToGet, allParameters); } microinvertersToGetIterator++; diff --git a/src/hoymiles/microinverter.cpp b/src/hoymiles/microinverter.cpp index 3a0a6f6..a34cb3b 100644 --- a/src/hoymiles/microinverter.cpp +++ b/src/hoymiles/microinverter.cpp @@ -1,4 +1,3 @@ -// #include #include #include #include @@ -10,14 +9,12 @@ Microinverter::Microinverter(std::shared_ptr modbus, long long serialNumber) { this->modbus = modbus; - // this->modbus_context_mutex = modbus_context_mutex; - this->serialNumber = serialNumber; } void Microinverter::updatePorts(std::vector ¶metersToGet, bool allParameters) { std::vector::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 ¶metersToGet, bool a std::cout << "Microinverter: " << this->serialNumber << std::endl; std::vector::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::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::iterator portsIterator = this->ports.begin(); + while(portsIterator != this->ports.end()) { + result += portsIterator->getParameterByName("totalProduction").first->getValue().first.i; + portsIterator++; + } + + return result; } \ No newline at end of file diff --git a/src/hoymiles/port.cpp b/src/hoymiles/port.cpp index f7eb3f6..081665e 100644 --- a/src/hoymiles/port.cpp +++ b/src/hoymiles/port.cpp @@ -77,15 +77,14 @@ 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; } - } + } } void Port::updateParameters(std::vector ¶metersToGet, bool allParameters) { @@ -109,7 +108,7 @@ void Port::updateParameters(std::vector ¶metersToGet, bool allP } this->fixCurrent(); - + parametersToGetIterator++; } } diff --git a/src/main.cpp b/src/main.cpp index ca13cb5..08ac74e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -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("-i,--ip_address", ipAddress, ipAddressHelp)->required(); + hoymilesClient.add_option("-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("-p,--port", port, portHelp); + hoymilesClient.add_option("-p,--port", port, portHelp)->group("Networking"); std::vector parametersToGet{}; - std::string parametersToGetHelp{"List of parameters to fetch, delimited by ',', example[par1,par2,par3]"}; - hoymilesClient.add_option>("-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>("-P,--parameters", parametersToGet, parametersToGetHelp)->delimiter(',')->group("Parameters"); bool allParameters = false; std::string allParametersHelp{"Fetch all parameters"}; - hoymilesClient.add_flag("-a,--all_parameters", allParameters, allParametersHelp); + hoymilesClient.add_flag("-a,--all_parameters", allParameters, allParametersHelp)->group("Parameters"); - bool ignoreNotConnected = false; - std::string ignoreNotConnectedHelp{"Ignore connection errors"}; - hoymilesClient.add_flag("-I,--ignore_conn_error", ignoreNotConnected, ignoreNotConnectedHelp); std::vector microinvertersToGet{}; - std::string microinvertersToGetHelp{"List of microinverters to fetch, if omitted all are fetched, delimited by ','"}; - hoymilesClient.add_option>("-m,--microinverters", microinvertersToGet, microinvertersToGetHelp)->delimiter(','); + std::string microinvertersToGetHelp{"List of microinverters to fetch, delimited by ','; if omitted, all are fetched"}; + hoymilesClient.add_option>("-m,--microinverters", microinvertersToGet, microinvertersToGetHelp)->delimiter(',')->group("Microinverters"); + + bool ignoreNotConnected = false; + std::string ignoreNotConnectedHelp{"Ignore conn_error"}; + hoymilesClient.add_flag("-I,--ignore_conn_error", ignoreNotConnected, ignoreNotConnectedHelp)->group("Debug"); try { hoymilesClient.parse(argc, argv);