#include "humireader.h" #include #include #include #include #include void showHelp() { fprintf(stderr, "# Parameters"); fprintf(stderr, "# [--once] [--help] [--(a|i)(t|h)min] [--(a|i)(t|h)max] \n"); fprintf(stderr, "# --once: run once then exit, other read/output continously \n"); fprintf(stderr, "# -- help: this\n"); fprintf(stderr, "# devPath: e.g. /dev/ttyUSB0"); fprintf(stderr, "# other parameters for emitting warnings when limits exceeded like:\n"); fprintf(stderr, "# (a|i) sensor A or sensor I of Humimaster\n"); fprintf(stderr, "# (t|h) limit for temp or humidty\n"); fprintf(stderr, "# min or max temp or humidity (degree C or 0-100 in percent)\n"); fprintf(stderr, "# On limit exceed output will by like TR_SENS_A_TEMPFAIL=1\n"); } int main(int argc, char **argv) { std::string devPath; // Min max limit for sensor a / i, humidity / temp int ahmin=0; int ahmax=100; int atmin=-9999; int atmax=9999; int ihmin=0; int ihmax=100; int itmin=-999; int itmax=999; bool runOnce = false; std::string prmMask = std::string("--abcde="); std::cout << "# TempReader 0.1 (c) 2018 MH" << std::endl; std::cout << "# (reads temp+humidty from 'HumiMaster')" << std::endl; try { for(int i=1; i < argc; i++) { auto s = std::string{argv[i]}; auto p = s.substr(0, prmMask.size()); auto limitNam = std::string(); int *currLimit = nullptr; //fprintf(stderr, "%i %i %s\n",i, argc, s.c_str()); if (p.compare("--ahmin=") == 0) { limitNam = "TR_A_HUMI_MIN"; currLimit = &ahmin; } else if (p.compare("--ahmax=") == 0) { limitNam = "TR_A_HUMI_MAX"; currLimit = &ahmax; } else if (p.compare("--atmin=") == 0) { limitNam = "TR_A_TEMP_MIN"; currLimit = &atmin; } else if (p.compare("--atmax=") == 0) { limitNam = "TR_A_TEMP_MAX"; currLimit = &atmax; } else if (p.compare("--ihmin=") == 0) { limitNam = "TR_I_HUMI_MIN"; currLimit = &ihmin; } else if (p.compare("--ihmax=") == 0) { limitNam = "TR_I_HUMI_MAX"; currLimit = &ihmax; } else if (p.compare("--itmin=") == 0) { limitNam = "TR_I_TEMP_MIN"; currLimit = &itmin; } else if (p.compare("--itmax=") == 0) { limitNam = "TR_I_TEMP_MAX"; currLimit = &itmax; } else if (s.compare("--once") == 0) { runOnce = true; } else if (s.compare("--help") == 0) { showHelp(); return 0; } else if (i == argc -1) { devPath = s; } if (currLimit != nullptr) { *currLimit=strtol(&s.c_str()[prmMask.size()], nullptr, 10); std::cout << limitNam << "=" << *currLimit << std::endl; } } if (argc == 0 || devPath.size() == 0) { showHelp(); return 1; } HumiReader reader(devPath); reader.setCallback([&, runOnce](const HumiResult& res) -> bool { fprintf(stdout, "# ------------\n"); fprintf(stdout, "TR_NEW_CYCLE=1\n"); fprintf(stdout, "TR_SENS_A_TEMP=%.2i\n", res.sensorATemp); fprintf(stdout, "TR_SENS_A_TEMP_DISP=\"%+.3i°C\"\n", res.sensorATemp); fprintf(stdout, "TR_SENS_A_HUMI=%i\n", res.sensorARelHumi); fprintf(stdout, "TR_SENS_A_HUMI_DISP=\"%.3i%%rH\"\n", res.sensorARelHumi); fprintf(stdout, "TR_SENS_I_TEMP=%.2i\n", res.sensorITemp); fprintf(stdout, "TR_SENS_I_TEMP_DISP=\"%+.3i°C\"\n", res.sensorITemp); fprintf(stdout, "TR_SENS_I_HUMI=%i\n", res.sensorIRelHumi); fprintf(stdout, "TR_SENS_I_HUMI_DISP=\"%.3i%%rH\"\n", res.sensorIRelHumi); //fprintf(stdout, "A: %+.3iC°, %.3i%%rH | I: %+.3iC°, %.3i%%rH\n", res.sensorATemp, res.sensorARelHumi, res.sensorITemp, res.sensorIRelHumi); int attrip = (res.sensorATemp < atmin || res.sensorATemp > atmax) ? 1 : 0; int ahtrip = (res.sensorARelHumi < ahmin || res.sensorARelHumi > ahmax) ? 1 : 0; int ittrip = (res.sensorITemp < itmin || res.sensorITemp > itmax) ? 1 : 0; int ihtrip = (res.sensorIRelHumi < ihmin || res.sensorIRelHumi > ihmax) ? 1 : 0; int trip = attrip || ahtrip || ittrip || ihtrip ? 1 : 0; fprintf(stdout, "TR_SENS_A_TEMP_TRIP=%i\n", attrip); fprintf(stdout, "TR_SENS_A_HUMI_TRIP=%i\n", ahtrip); fprintf(stdout, "TR_SENS_I_TEMP_TRIP=%i\n", ittrip); fprintf(stdout, "TR_SENS_I_HUMI_TRIP=%i\n", ihtrip); fprintf(stdout, "TR_TRIP=%i\n",trip); //fprintf(stdout, "\n", res.sensorITemp, res.sensorIRelHumi); return !runOnce; }); reader.run(); return 0; } catch (const std::exception& e) { std::cerr << "Error executing " << e.what(); return 1; } }