Bonjour les amis,

Je viens ici poser une petite question :
J'ai construit un script nodeJS qui mesure la température a l'aide d'un sonde DS18B20 et enregistre la température dans une base de donnée toute les heures.
De plus elle envoie quelques mail en cas de dépassement de seuils de températures, qui sont vérifiés toutes les minutes.
Le problème est le suivant :
Quand je lance mon application nodeJS, elle s'arrête 8 Heures après. Quoi qu'il arrive, indépendamment du nombre de mesures, à 8 heures d'utilisation il s'arrête.
Je ne comprend pas le problème.
L'application tourne sur raspberry 0.
Je suis en train d'apprendre le nodeJS en même temps que je code ceci, je suis donc ouvert aussi aux critiques pour m'améliorer.

Voici le code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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);
}
Merci d'avance et bonne soirée .

edit : J'ai continué a cherché, notemment au niveau de la mémoire, mais le programme semble constant, entre 45 et 65 Mo de ram. Il n'a pas l'air de grossir plus que cela.