2024-03-20 11:28:43 +01:00
|
|
|
#include <chrono>
|
2024-03-12 23:26:23 +01:00
|
|
|
#include <iostream>
|
2024-03-13 00:18:10 +01:00
|
|
|
#include <string>
|
2024-03-13 16:54:03 +01:00
|
|
|
#include <thread>
|
2024-03-20 11:28:43 +01:00
|
|
|
#include <vector>
|
2024-03-20 16:15:07 +01:00
|
|
|
#include <signal.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <stdio.h>
|
2024-03-13 16:54:03 +01:00
|
|
|
|
2024-03-20 11:28:43 +01:00
|
|
|
#include "CLI11.hpp"
|
2024-03-13 00:18:10 +01:00
|
|
|
#include "modbus.h"
|
2024-03-20 11:28:43 +01:00
|
|
|
|
2024-03-16 21:15:15 +01:00
|
|
|
#include "dtu.h"
|
2024-03-12 23:26:23 +01:00
|
|
|
|
2024-03-20 16:15:07 +01:00
|
|
|
void sigHandler(int signal);
|
|
|
|
|
|
2024-03-20 11:28:43 +01:00
|
|
|
int main(int argc, char **argv) {
|
2024-03-20 16:15:07 +01:00
|
|
|
signal(SIGINT, sigHandler);
|
|
|
|
|
signal(SIGTERM, sigHandler);
|
|
|
|
|
signal(SIGABRT, sigHandler);
|
|
|
|
|
|
2024-03-20 19:39:25 +01:00
|
|
|
std::string version{"v1.0a"};
|
2024-03-20 19:11:10 +01:00
|
|
|
std::cout << version << std::endl;
|
|
|
|
|
|
2024-03-20 11:28:43 +01:00
|
|
|
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 + "}"};
|
2024-03-20 14:40:02 +01:00
|
|
|
hoymilesClient.add_option<std::string>("-i,--ip_address", ipAddress, ipAddressHelp)->required();
|
2024-03-20 11:28:43 +01:00
|
|
|
|
|
|
|
|
int port{502};
|
|
|
|
|
std::string portHelp{"Port of DTU {default: " + std::to_string(port) + "}"};
|
|
|
|
|
hoymilesClient.add_option<int>("-p,--port", port, portHelp);
|
|
|
|
|
|
|
|
|
|
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(',');
|
|
|
|
|
|
|
|
|
|
bool allParameters = false;
|
|
|
|
|
std::string allParametersHelp{"Fetch all parameters"};
|
|
|
|
|
hoymilesClient.add_flag<bool>("-a,--all_parameters", allParameters, allParametersHelp);
|
|
|
|
|
|
|
|
|
|
bool ignoreNotConnected = false;
|
|
|
|
|
std::string ignoreNotConnectedHelp{"Ignore connection errors"};
|
|
|
|
|
hoymilesClient.add_flag<bool>("-I,--ignore_conn_error", ignoreNotConnected, ignoreNotConnectedHelp);
|
|
|
|
|
|
2024-03-20 16:39:25 +01:00
|
|
|
std::vector<long long> microinvertersToGet{};
|
2024-03-20 14:40:02 +01:00
|
|
|
std::string microinvertersToGetHelp{"List of microinverters to fetch, if omitted all are fetched, delimited by ','"};
|
2024-03-20 16:39:25 +01:00
|
|
|
hoymilesClient.add_option<std::vector<long long>>("-m,--microinverters", microinvertersToGet, microinvertersToGetHelp)->delimiter(',');
|
2024-03-20 14:40:02 +01:00
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
hoymilesClient.parse(argc, argv);
|
|
|
|
|
} catch (const CLI::ParseError &e) {
|
|
|
|
|
return hoymilesClient.exit(e);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::cout << "Mapping out DTU" << std::endl;
|
2024-03-20 11:28:43 +01:00
|
|
|
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<std::chrono::milliseconds>(endTime - startTime).count() << "ms" << std::endl;
|
2024-03-12 23:26:23 +01:00
|
|
|
|
2024-03-20 14:40:02 +01:00
|
|
|
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<std::chrono::milliseconds>(endTime - startTime).count() << "ms" << std::endl;
|
|
|
|
|
|
|
|
|
|
dtu.printMicroinverters(parametersToGet, allParameters, microinvertersToGet);
|
|
|
|
|
std::cout << std::endl;
|
2024-03-20 11:28:43 +01:00
|
|
|
}
|
2024-03-15 11:46:44 +01:00
|
|
|
|
2024-03-20 11:28:43 +01:00
|
|
|
return 0;
|
2024-03-20 16:15:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void sigHandler(int signal) {
|
2024-03-20 19:39:25 +01:00
|
|
|
std::cerr << "Interrupted\n";
|
2024-03-20 16:15:07 +01:00
|
|
|
exit(0);
|
2024-03-12 23:26:23 +01:00
|
|
|
}
|