/* Obtient la température de la serre et établie la température cible de la cuve */ #include #include #include #include #include #include #include #include #include using namespace std; static const char *coinscmd = "/usr/bin/coins"; static string make_coins_cmd(const char *cmd) { return string_f("%s %s",coinscmd,cmd); } static void target_log (PARAM_STRING str) { glocal str; ("/var/log/settargettemp.log",true); time_t tt = time(nullptr); struct tm *t = localtime(&tt); fprintf (fout,"%04d/%02d/%02d-%02d:%02d:%02d %s\n" ,t->tm_year+1900,t->tm_mon+1,t->tm_mday ,t->tm_hour,t->tm_min,t->tm_sec ,glocal.str.ptr); return 0; } static int target_system (PARAM_STRING cmd) { int ret = system(cmd.ptr); target_log (string_f("Exécute %s -> ret=%d",cmd.ptr,ret)); return ret; } int main (int argc, char *argv[]) { glocal const char *host = "serre"; glocal const char *port = "43"; glocal int monitor_ext = 5; // Température extérieure glocal int monitor1 = 6; // Température intérieure 1 de la serre glocal int monitor2 = 9; // Température intérieure 2 de la serre glocal int trigger = 23; glocal int exttemp_max = 26; // Température extérieure maximum (il faut couper le chauffage) glocal int exttemp_low = 18; // Température extérieure fraiche (il faut activer le chauffage) glocal int exttemp_cold = 5; // Température extérieure basse (il faut activer le chauffage maximum) glocal bool testmode = false; glocal int ret = -1; glocal.ret = (argc,argv); setproginfo ("","0.0","..."); setarg (' ',"monitor_ext","Sélecteur pour la température extérieure de la serre",glocal.monitor_ext,false); setarg ('m',"monitor1","Sélecteur pour la température intérieure 1 de la serre",glocal.monitor1,false); setarg ('M',"monitor2","Sélecteur pour la température intérieure 2 de la serre",glocal.monitor2,false); setarg ('t',"trigger","Température intérieure de la serre qui change la cible",glocal.trigger,false); setarg (' ',"exttemp_max","Température extérieure qui éteint les mineurs",glocal.exttemp_max,false); setarg (' ',"exttemp_low","Température extérieure fraiche qui repart les mineurs",glocal.exttemp_low,false); setarg (' ',"exttemp_cold","Température extérieure fraiche qui repart tout les mineurs",glocal.exttemp_cold,false); setarg (' ',"testmode","Mode simulation, affiche ce qui sera fait",glocal.testmode,false); setarg (' ',"coinscmd","Commande coins",coinscmd,false); int ret = -1; glocal double exttemp = 0; glocal double inttemp = 0; glocal int noline = 0; (glocal.host,glocal.port,5); send ("gettemp\n"); if (is_eq(line,"fin")){ end = true; }else{ glocal.noline++; if (glocal.noline == glocal.monitor_ext){ glocal.exttemp = atof(line); }else if (glocal.noline == glocal.monitor1){ glocal.inttemp = atof(line); }else if (glocal.noline == glocal.monitor2){ double temp = atof(line); if (temp > glocal.inttemp) glocal.inttemp = temp; } debug_printf ("line %d=%s\n",glocal.noline,line); } glocal int target = 53; debug_printf ("inttemp=%lf trigger=%d\n",glocal.inttemp,glocal.trigger); if (glocal.inttemp > glocal.trigger){ if (glocal.testmode) printf ("target=40\n"); glocal.target=40; } debug_printf ("inttemp=%lf target=%d\n",glocal.inttemp,glocal.target); // Met à jour /root/targettemp s'il y a eu un changement, ou si le fichier est manquant glocal bool update = true; glocal vector mineurs; // Mineurs glocal vector runnings; // Mineurs actifs ("/root/targettemp",true); int target = atoi(line); if (target == glocal.target) glocal.update = false; return 0; (make_coins_cmd("list"),5); glocal.mineurs.push_back(line); return 0; glocal.noline = 0; (make_coins_cmd("online"),5); glocal.noline++; if (glocal.noline > 1) glocal.runnings.push_back(line); return 0; string cmd; if (glocal.exttemp > glocal.exttemp_max && glocal.runnings.size() > 0){ cmd = make_coins_cmd("offline-stop"); for (auto &r:glocal.runnings) cmd += string_f(" %s",r.c_str()); }else if (glocal.exttemp < glocal.exttemp_low && glocal.runnings.size() ==0){ size_t enable = 2; if (glocal.exttemp < glocal.exttemp_cold){ enable = glocal.mineurs.size(); } cmd = make_coins_cmd("online"); for (size_t i=0; i< enable; i++) cmd += string_f (" %s",glocal.mineurs[i].c_str()); } if (cmd.size() > 0){ if (glocal.testmode){ printf ("Exécute: %s\n",cmd.c_str()); }else{ target_system (cmd); } } if (glocal.update){ if (glocal.testmode){ printf ("Mise à jour de /root/targettemp: %d\n",glocal.target); }else{ target_log (string_f("Mise à jour de /root/targettemp: %d",glocal.target)); ("/root/targettemp",false); fprintf (fout,"%d\n",glocal.target); return 0; target_system ("/root/setpidcontrol on"); } } return ret; return glocal.ret; }