1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
|
//dependances
const Net = require('net'); //serveur TCP
const Gpio = require('onoff').Gpio; // Lampe
const sondeTemperature = require('ds18b20-raspi'); //Sonde température
const nodemailer = require('nodemailer'); //les mails
const logs = require('fs'); // logs
const bdd = require('mysql'); //bdd
//variables nécéssaires
const lampe = new Gpio(17, 'out');
const port = 1025; // port du serveur TCP
const listeSonde = sondeTemperature.list(); // recense la liste des capteurs de température disponible
var boolTemperature = 0; // Si erreur avec la sonde alors passage à 1;
const TempscooldownMail = 5; //sert pour empêcher le spam de mail, temps en minutes
var cooldownMail = 0;
var nbBoucle = 60; // nb de boucle de mesure - 60 pour une heure
//en cas d'erreurs, les infos mails
const transporter = nodemailer.createTransport(
{
service: 'gmail',
auth:
{
user: '',
pass: ''
}
});
//tableau des données reçu et utiles
var tabDonnee = new Array();
// tabDonnee[0] = variables lumières
tabDonnee[0] = new Array();
tabDonnee[0][0] = 0; //etat de la lampe _ 1 = allumé - 0 = eteint
tabDonnee[0][1] = "11:00" //Heure d'allumage de la lampe
tabDonnee[0][2] = "22:00" //Heure d'extinction de la lampe
setTimeout( ()=> {
if(listeSonde.length < 1) // si pas de sonde détecté
{
boolTemperature = 1;
mailAlerte("sondeManquante");
erreurLogs("sondeManquante");
return;
}
else // si sonde détecté
{
tabDonnee[2] = new Array();
tabDonnee[2][0] = listeSonde[0]; //Adresse de la sonde de température
tabDonnee[2][1] = sondeTemperature.readC(listeSonde[0]); //température actuel en celsius
tabDonnee[2][3] = "28.00" // température seuil haut (maximum ,dans l'aquarium)
tabDonnee[2][4] = "25.00" // température seuil bas (minimum ,dans l'aquarium)
}
},1000);
let timerMinute = setInterval(() => {VerifMinute();}, 60000); //timer de vérification des minutes, boucle toute les minutes. 60000
/*const server = new Net.Server();
server.listen(port, function() {
});
server.on('connection', function(socket)
{
var donnee = "";
socket.on('data', function(chunk)
{
donnee =chunk.toString().split('-');
});
socket.on('end', function() {
//Action avec la trame "donnee"
});
socket.on('error', function(err) {
erreurLogs("erreur TCP : "+err)
});
});*/
function VerifMinute()
{
var heure = new Date(); // variable a créer a chaque itération pour quelle sois a jour
var temp = (heure.getHours()<10?'0':'') + heure.getHours()+":"+(heure.getMinutes()<10?'0':'') + heure.getMinutes(); // si le chiffre des heures est inférieur a 10 (donc de 0 à 9) il faut ajouter un 0 non significatif devant
//vérification de l'heure de la lumière
if(temp == tabDonnee[0][1]){lampe.writeSync(1);}
if(temp == tabDonnee[0][2]){lampe.writeSync(0);}
//vérification de la température et des seuils
if(boolTemperature == 0 & cooldownMail == 0)
{
tabDonnee[2][1] = sondeTemperature.readC(listeSonde);
if((tabDonnee[2][1] < tabDonnee[2][4]) | (tabDonnee[2][1] > tabDonnee[2][3]))
{
mailAlerte("seuilTemperature");
}
}
if(cooldownMail > 0) cooldownMail = cooldownMail -1; //verif spam mail
if(nbBoucle > 9)
{
nbBoucle = 0;
MesurePeriodiqueHeure(); //mesure + enregistrrment en bdd
}
else nbBoucle = nbBoucle +1;
}
function MesurePeriodiqueHeure()
{
var contenu = "";
mem = process.memoryUsage(); // Test memoire
var dateHeure = new Date();
var date = dateHeure.getFullYear()+"-"+(dateHeure.getMonth()+1)+"-"+dateHeure.getDate();
var heure = (dateHeure.getHours()<10?'0':'') + dateHeure.getHours()+":"+(dateHeure.getMinutes()<10?'0':'') + dateHeure.getMinutes()+":"+(dateHeure.getSeconds()<10?'0':'') + dateHeure.getSeconds();
if(boolTemperature == 0)
{
var mySqlClient = bdd.createConnection(
{
host : "",
user : "",
password : "",
database : ""
});
var selectQuery = "INSERT INTO `historique_temperature`(`date`, `heure`, `num_sonde`, `temperature`) VALUES (\""+date+"\",\""+heure+"\",\""+tabDonnee[2][0]+"\",\""+tabDonnee[2][1]+"\")";
mySqlClient.query(selectQuery,function select(error, results, fields)
{
if (error)
{
mySqlClient.end();
mailAlerte("erreurBDD");
erreurLogs("erreur BDD : "+error);
return;
}
erreurLogs(contenu);
contenu = null;
});
}
}
function mailAlerte(erreur) //envoie de mail erreur
{
if(cooldownMail <= 0)
{
switch(erreur)
{
case "sondeManquante" :
var mailOptions = {
from: 'xx@xx.fr',
to: 'xx@xx.fr',
cc: 'xx@xx.fr',
subject: 'Aquarium - Attention requise',
text: 'Le système de l\'aquarium a détecté un problème.\n Aucune sonde de température détectée. La température ne peut pas être mesurée.\nLe problème ne peut être résolue par le système.\n L\'attention d\'un opérateur est requise. \n\n Bien à vous, Jean-Michel, BOT assistant.\n\n\n -- Robot, ne pas répondre à ce mail --'
};
break;
case "seuilTemperature" :
var mailOptions = {
from: 'xx@xx.fr',
to: 'xx@xx.fr',
cc: 'xx@xx.fr',
subject: 'Aquarium - Attention requise',
text: 'Le système de l\'aquarium a détecté un problème.\n Un seuil de température a été franchi.\nTempérature actuelle : '+tabDonnee[2][1]+'°C, mesurée par la sonde : '+tabDonnee[2][0]+'\n seuil minimum : '+tabDonnee[2][4]+'°C\n seuil maximum : '+tabDonnee[2][3]+'°C\nSonde en cours de redémarrage. \n\n Bien à vous, Jean-Michel, BOT assistant.\n\n\n -- Robot, ne pas répondre à ce mail --'
};
break;
case "erreurBDD" :
var mailOptions = {
from: 'xx@xx.fr',
to: 'xx@xx.fr',
cc: 'xx@xx.fr',
subject: 'Aquarium - Attention requise',
text: 'Le système de l\'aquarium a détecté un problème.\n La base de donnée a envoyé une erreur. Insertion des données impossibles. \n\n Bien à vous, Jean-Michel, BOT assistant.\n\n\n -- Robot, ne pas répondre à ce mail --'
};
break;
}
setTimeout(function()
{
transporter.sendMail(mailOptions, function(error, info){
if (error) {erreurLogs("erreur mail : "+error);return;}
else {
cooldownMail = TempscooldownMail;
}
});
},1000);
}
}
function erreurLogs(contenu) //logs des erreurs
{
var contenu = contenu + mem;
console.log("mem : ");
console.log(process.memoryUsage());
const dateHeure = new Date();
var heure = (dateHeure.getHours()<10?'0':'') + dateHeure.getHours()+":"+(dateHeure.getMinutes()<10?'0':'') + dateHeure.getMinutes()+":"+(dateHeure.getSeconds()<10?'0':'') + dateHeure.getSeconds();
contenu = ""+heure+" : "+contenu+"\n";
setTimeout (() => {
logs.appendFile('/home/pi/nodeJS/logs/logs.log', contenu, function (err) {
if (err) console.log('erreur avec les logs ! + '+err);
else {console.log("log ecrit");}
});
},200);
} |
Partager