From 2c27810dfe05f402e7fde2c3ceb74f157cd07c71 Mon Sep 17 00:00:00 2001 From: trabus322 Date: Wed, 20 Mar 2024 14:40:02 +0100 Subject: [PATCH] Implemented parameters, made it granular --- inc/hoymiles/dtu.h | 16 +++------ inc/hoymiles/microinverter.h | 8 ++--- inc/hoymiles/port.h | 8 ++--- src/hoymiles/dtu.cpp | 64 +++++++++++++++------------------- src/hoymiles/microinverter.cpp | 32 +++-------------- src/hoymiles/port.cpp | 43 +++++++++++------------ src/main.cpp | 36 ++++++++++--------- 7 files changed, 84 insertions(+), 123 deletions(-) diff --git a/inc/hoymiles/dtu.h b/inc/hoymiles/dtu.h index 94c4be1..68c01b4 100644 --- a/inc/hoymiles/dtu.h +++ b/inc/hoymiles/dtu.h @@ -4,22 +4,14 @@ #include #include #include -// #include #include "microinverter.h" #include "modbus.h" -// struct _modbus; -// typedef _modbus modbus_t; - class Dtu { private: - // std::shared_ptr modbus_context; - std::shared_ptr modbus; - // std::mutex modbus_context_mutex; - std::vector microinverters; bool connected; @@ -33,13 +25,13 @@ class Dtu { bool isConnected(); - void updateMicroinverters(); + // void updateMicroinverters(); - void updateMicroinverters(std::vector ¶metersToGet); + void updateMicroinverters(std::vector ¶metersToGet, bool allParameters, std::vector µinvertersToGet); - void printMicroinverters(); + // void printMicroinverters(); - void printMicroinverters(std::vector ¶metersToGet); + void printMicroinverters(std::vector ¶metersToGet, bool allParameters, std::vector µinvertersToGet); ~Dtu(); }; diff --git a/inc/hoymiles/microinverter.h b/inc/hoymiles/microinverter.h index c3e9f9f..d6964a4 100644 --- a/inc/hoymiles/microinverter.h +++ b/inc/hoymiles/microinverter.h @@ -30,17 +30,17 @@ class Microinverter { std::vector ports; - void updatePorts(); + // void updatePorts(); - void updatePorts(std::vector ¶metersToGet); + void updatePorts(std::vector ¶metersToGet, bool allParameters); void updatePort(int i); Port getPort(int i); - void printPorts(); + // void printPorts(); - void printPorts(std::vector ¶metersToGet); + void printPorts(std::vector ¶metersToGet, bool allParameters); }; #endif \ No newline at end of file diff --git a/inc/hoymiles/port.h b/inc/hoymiles/port.h index e433d5a..3f32d25 100644 --- a/inc/hoymiles/port.h +++ b/inc/hoymiles/port.h @@ -26,13 +26,13 @@ class Port { std::vector> parameters; - void updateParameters(); + // void updateParameters(); - void updateParameters(std::vector ¶metersToGet); + void updateParameters(std::vector ¶metersToGet, bool allParameters); - void printParameters(); + // void printParameters(); - void printParameters(std::vector ¶metersToGet); + void printParameters(std::vector ¶metersToGet, bool allParameters); }; #endif \ No newline at end of file diff --git a/src/hoymiles/dtu.cpp b/src/hoymiles/dtu.cpp index 30afcd3..d12b31e 100644 --- a/src/hoymiles/dtu.cpp +++ b/src/hoymiles/dtu.cpp @@ -60,9 +60,7 @@ void Dtu::populateMicroinverters() { portStartAddress += 0x0028; - // this->modbus_context_mutex.lock(); registerCount = this->modbus.get()->modbus_read_holding_registers(portStartAddress + 0x0021, 1, readArray); - // this->modbus_context_mutex.unlock(); } } @@ -79,46 +77,40 @@ std::pair Dtu::getMicroinverterBySerialNumber(long serialN return std::pair(false, &*microinvertersIterator); } -void Dtu::updateMicroinverters() { - // std::vector updateThreads; - - std::vector::iterator microinvertersIterator = this->microinverters.begin(); - while (microinvertersIterator != this->microinverters.end()) { - // updateThreads.push_back(std::thread(&Microinverter::updatePorts, microinvertersIterator)); - microinvertersIterator->updatePorts(); - microinvertersIterator++; +void Dtu::updateMicroinverters(std::vector ¶metersToGet, bool allParameters, std::vector µinvertersToGet) { + if(microinvertersToGet.empty()) { + std::vector::iterator microinvertersIterator = this->microinverters.begin(); + while(microinvertersIterator != this->microinverters.end()) { + microinvertersToGet.push_back(microinvertersIterator->serialNumber); + microinvertersIterator++; + } } - // std::vector::iterator updateThreadsIterator = updateThreads.begin(); - // while(updateThreadsIterator != updateThreads.end()) { - // updateThreadsIterator->join(); updateThreadsIterator++; - // } - // std::cout << std::endl; -} - -void Dtu::updateMicroinverters(std::vector ¶metersToGet) { - std::vector::iterator microinvertersIterator = this->microinverters.begin(); - while(microinvertersIterator != this->microinverters.end()) { - microinvertersIterator->updatePorts(parametersToGet); - microinvertersIterator++; + std::vector::iterator microinvertersToGetIterator = microinvertersToGet.begin(); + while(microinvertersToGetIterator != microinvertersToGet.end()) { + std::pair microinverterPair = this->getMicroinverterBySerialNumber(*microinvertersToGetIterator); + if(microinverterPair.first) { + microinverterPair.second->updatePorts(parametersToGet, allParameters); + } + microinvertersToGetIterator++; } } -void Dtu::printMicroinverters() { - std::cout << "DTU:" << std::endl; - std::vector::iterator microinvertersIterator = this->microinverters.begin(); - while(microinvertersIterator != this->microinverters.end()) { - microinvertersIterator->printPorts(); - std::cout << std::endl; - microinvertersIterator++; +void Dtu::printMicroinverters(std::vector ¶metersToGet, bool allParameters, std::vector µinvertersToGet) { + if(microinvertersToGet.empty()) { + std::vector::iterator microinvertersIterator = this->microinverters.begin(); + while(microinvertersIterator != this->microinverters.end()) { + microinvertersToGet.push_back(microinvertersIterator->serialNumber); + microinvertersIterator++; + } } -} -void Dtu::printMicroinverters(std::vector ¶metersToGet) { - std::cout << "DTU:" << std::endl; - std::vector::iterator microinvertersIterator = this->microinverters.begin(); - while(microinvertersIterator != this->microinverters.end()) { - microinvertersIterator->printPorts(parametersToGet); - microinvertersIterator++; + std::vector::iterator microinvertersToGetIterator = microinvertersToGet.begin(); + while(microinvertersToGetIterator != microinvertersToGet.end()) { + std::pair microinverterPair = this->getMicroinverterBySerialNumber(*microinvertersToGetIterator); + if(microinverterPair.first) { + microinverterPair.second->printPorts(parametersToGet, allParameters); + } + microinvertersToGetIterator++; } } \ No newline at end of file diff --git a/src/hoymiles/microinverter.cpp b/src/hoymiles/microinverter.cpp index c86c144..87eb2ea 100644 --- a/src/hoymiles/microinverter.cpp +++ b/src/hoymiles/microinverter.cpp @@ -15,44 +15,20 @@ Microinverter::Microinverter(std::shared_ptr modbus, long serialNu this->serialNumber = serialNumber; } -void Microinverter::updatePorts() { - // std::vector updateThreads; - for(Port port : this->ports){ - // updateThreads.push_back(std::thread(&Port::updateParameters, port)); - port.updateParameters(); - } - // std::vector::iterator updateThreadsIterator = updateThreads.begin(); - // while(updateThreadsIterator != updateThreads.end()) { - // updateThreadsIterator->join(); - // updateThreadsIterator++; - // } -} - -void Microinverter::updatePorts(std::vector ¶metersToGet) { +void Microinverter::updatePorts(std::vector ¶metersToGet, bool allParameters) { std::vector::iterator portsIterator = this->ports.begin(); while(portsIterator != this->ports.end()) { - portsIterator->updateParameters(parametersToGet); + portsIterator->updateParameters(parametersToGet, allParameters); portsIterator++; } } -void Microinverter::printPorts() { +void Microinverter::printPorts(std::vector ¶metersToGet, bool allParameters) { std::cout << "Microinverter: " << this->serialNumber << std::endl; std::vector::iterator portsIterator = this->ports.begin(); while(portsIterator != this->ports.end()) { - portsIterator->printParameters(); - std::cout << std::endl; - portsIterator++; - } -} - -void Microinverter::printPorts(std::vector ¶metersToGet) { - std::cout << "Microinverter: " << this->serialNumber << std::endl; - - std::vector::iterator portsIterator = this->ports.begin(); - while(portsIterator != this->ports.end()) { - portsIterator->printParameters(parametersToGet); + portsIterator->printParameters(parametersToGet, allParameters); std::cout << std::endl; portsIterator++; } diff --git a/src/hoymiles/port.cpp b/src/hoymiles/port.cpp index 67182b6..2021f7a 100644 --- a/src/hoymiles/port.cpp +++ b/src/hoymiles/port.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "modbus.h" @@ -60,6 +61,7 @@ std::pair, bool> Port::getParameterByName(std::st result.first = *parametersIterator; result.second = true; } + parametersIterator++; } return result; @@ -84,16 +86,17 @@ void Port::fixCurrent() { this->currentFixed = true; } -void Port::updateParameters() { - std::vector>::iterator parametersIterator{this->parameters.begin()}; - while (parametersIterator != this->parameters.end()) { - parametersIterator->get()->updateValue(this->modbus, this->portStartAddress); - parametersIterator++; +void Port::updateParameters(std::vector ¶metersToGet, bool allParameters) { + if(allParameters && parametersToGet.size() < this->parameters.size()) { + std::vector>::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++; + } } - this->fixCurrent(); -} -void Port::updateParameters(std::vector ¶metersToGet) { std::vector::iterator parametersToGetIterator = parametersToGet.begin(); while(parametersToGetIterator != parametersToGet.end()) { std::pair, bool> parameterPair; @@ -102,27 +105,22 @@ void Port::updateParameters(std::vector ¶metersToGet) { if(parameterPair.second) { parameterPair.first->updateValue(this->modbus, this->portStartAddress); } - parametersToGetIterator++; } } -void Port::printParameters() { - std::vector>::iterator parametersIterator = this->parameters.begin(); - - if(parametersIterator != this->parameters.end()) { - std::cout << "|"; +void Port::printParameters(std::vector ¶metersToGet, bool allParameters) { + if(allParameters && parametersToGet.size() < this->parameters.size()) { + std::vector>::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++; + } } - while(parametersIterator != this->parameters.end()) { - std::cout << " " << parametersIterator->get()->name << ": " << parametersIterator->get()->getOutputValue() << " |"; - parametersIterator++; - } -} - -void Port::printParameters(std::vector ¶metersToGet) { std::vector::iterator parametersToGetIterator = parametersToGet.begin(); - if(parametersToGetIterator != parametersToGet.end()) { std::cout << "|"; } @@ -134,6 +132,7 @@ void Port::printParameters(std::vector ¶metersToGet) { if(parameterPair.second) { std::cout << " " << parameterPair.first->name << ": " << parameterPair.first->getOutputValue() << " |"; } + parametersToGetIterator++; } } \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 3e7a2d8..10fc4ba 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,12 +10,11 @@ #include "dtu.h" int main(int argc, char **argv) { - 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); + hoymilesClient.add_option("-i,--ip_address", ipAddress, ipAddressHelp)->required(); int port{502}; std::string portHelp{"Port of DTU {default: " + std::to_string(port) + "}"}; @@ -33,27 +32,30 @@ int main(int argc, char **argv) { 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(','); + + try { + hoymilesClient.parse(argc, argv); + } catch (const CLI::ParseError &e) { + return hoymilesClient.exit(e); + } + + std::cout << "Mapping out DTU" << std::endl; auto startTime = std::chrono::high_resolution_clock::now(); Dtu dtu{ipAddress.c_str(), port}; auto endTime = std::chrono::high_resolution_clock::now(); std::cout << "DTU construction time: " << std::chrono::duration_cast(endTime - startTime).count() << "ms" << std::endl; - while (dtu.isConnected() || ignoreNotConnected) { - if (allParameters) { - startTime = std::chrono::high_resolution_clock::now(); - dtu.updateMicroinverters(); - endTime = std::chrono::high_resolution_clock::now(); - std::cout << "DTU update time: " << std::chrono::duration_cast(endTime - startTime).count() << "ms" << std::endl; + while ((dtu.isConnected() || ignoreNotConnected) && (!parametersToGet.empty() || allParameters)) { + startTime = std::chrono::high_resolution_clock::now(); + dtu.updateMicroinverters(parametersToGet, allParameters, microinvertersToGet); + endTime = std::chrono::high_resolution_clock::now(); + std::cout << "DTU update time: " << std::chrono::duration_cast(endTime - startTime).count() << "ms" << std::endl; - dtu.printMicroinverters(); - } else { - startTime = std::chrono::high_resolution_clock::now(); - dtu.updateMicroinverters(parametersToGet); - endTime = std::chrono::high_resolution_clock::now(); - std::cout << "DTU update time: " << std::chrono::duration_cast(endTime - startTime).count() << "ms" << std::endl; - - dtu.printMicroinverters(parametersToGet); - } + dtu.printMicroinverters(parametersToGet, allParameters, microinvertersToGet); + std::cout << std::endl; } return 0;