...
 
Commits (2)
...@@ -9,6 +9,8 @@ class Controller extends MY_Controller { ...@@ -9,6 +9,8 @@ class Controller extends MY_Controller {
protected $consigneMonitoring; // Localisation du fichier de consigne utiliser pour la maintenance protected $consigneMonitoring; // Localisation du fichier de consigne utiliser pour la maintenance
protected $idExtraitVisualisation ; // Tableau contenant les identifiants des capteurs utilisees pour generer l'extrait
protected $idAnalyse; // Tableau contenant les identifiants des capteurs utilisees dans l'analyse
public function __construct() { public function __construct() {
parent::__construct(); parent::__construct();
$this->serveur_mqtt = 'icaging.com'; $this->serveur_mqtt = 'icaging.com';
...@@ -17,6 +19,8 @@ class Controller extends MY_Controller { ...@@ -17,6 +19,8 @@ class Controller extends MY_Controller {
$this->topicMQTT_Changes = "/system/changeCapteur"; $this->topicMQTT_Changes = "/system/changeCapteur";
$this->topicMQTT_Notif = "/system/notification/".$this->session->userdata('id'); $this->topicMQTT_Notif = "/system/notification/".$this->session->userdata('id');
$this->consigneMonitoring = python('ConsigneMonitoring.txt'); $this->consigneMonitoring = python('ConsigneMonitoring.txt');
$this->idExtraitVisualisation = [168, 175, 176, 177, 178, 179]; // capteur labo : [181, 182, 183, 184, 185, 186];
$this->idAnalyse = [168, 175, 176, 177, 178, 179];
//$this->load->library('form_validation'); //$this->load->library('form_validation');
// charge les helpers pour les assets // charge les helpers pour les assets
...@@ -490,6 +494,15 @@ class Controller extends MY_Controller { ...@@ -490,6 +494,15 @@ class Controller extends MY_Controller {
exec('python '.python("VisualisationComplexe.py").' '.$id.' "'.$debut.'" "'.$fin.'" '.$unite.' '.$limite.' '.$moyMob.' '.$uuidProcess.' "'.$nom.'" > /dev/null 2>&1 &'); exec('python '.python("VisualisationComplexe.py").' '.$id.' "'.$debut.'" "'.$fin.'" '.$unite.' '.$limite.' '.$moyMob.' '.$uuidProcess.' "'.$nom.'" > /dev/null 2>&1 &');
} }
/* Traitement : Execute un script python qui va generer une image et un fichier texte decrivant la progression */
public function executeExtraitPython() {
$uuidProcess = $this->input->post('uuid');
$debut = $this->valeurs->get_last_valeur($this->idExtraitVisualisation[0])[0]->temps;
exec('python '.python("ExtraitVisu.py").' "'.$uuidProcess.'" "'.$debut.'" '.$this->idExtraitVisualisation[0].' '.$this->idExtraitVisualisation[1].' '.$this->idExtraitVisualisation[2].' '.$this->idExtraitVisualisation[3].' '.$this->idExtraitVisualisation[4].' '.$this->idExtraitVisualisation[5].' > /dev/null 2>&1 &');
}
/* AJAX : Lecture du fichier texte generee par le script python pour connaitre la progression */ /* AJAX : Lecture du fichier texte generee par le script python pour connaitre la progression */
public function updatePython($uuid){ public function updatePython($uuid){
if (file_exists(python('log_'.$uuid.'.txt')) && filesize(python('log_'.$uuid.'.txt')) !== 0){ if (file_exists(python('log_'.$uuid.'.txt')) && filesize(python('log_'.$uuid.'.txt')) !== 0){
...@@ -615,5 +628,62 @@ class Controller extends MY_Controller { ...@@ -615,5 +628,62 @@ class Controller extends MY_Controller {
redirect('controller/monitoring'); redirect('controller/monitoring');
} }
/* Page : Analyse des donnees */
public function analyse($idCapteur = null, $debut = null, $fin = null) {
$this->header() ;
$this->load->view('pages/analyse');
$this->load->view('fragment/footer');
}
/* Traitement : Execute un script python d'analyse qui va generer une image et un fichier texte decrivant la progression */
public function executeAnalysePython() {
$capteur0 = $this->input->post('capteur0');
if (empty($capteur0)) {
$capteur0 = $this->idAnalyse[0];
}
$capteur1 = $this->input->post('capteur1');
if (empty($capteur1)) {
$capteur1 = $this->idAnalyse[1];
}
$capteur2 = $this->input->post('capteur2');
if (empty($capteur2)) {
$capteur2 = $this->idAnalyse[2];
}
$capteur3 = $this->input->post('capteur3');
if (empty($capteur3)) {
$capteur3 = $this->idAnalyse[3];
}
$capteur4 = $this->input->post('capteur4');
if (empty($capteur4)) {
$capteur4 = $this->idAnalyse[4];
}
$capteur5 = $this->input->post('capteur5');
if (empty($capteur5)) {
$capteur5 = $this->idAnalyse[5];
}
$debut = $this->input->post('debut');
$fin = $this->input->post('fin');
$moyMob = $this->input->post('moyMob');
$variation = $this->input->post('variation');
$periode = $this->input->post('periode');
$synchro = $this->input->post('synchro');
$uuidProcess = $this->input->post('uuid');
exec('python '.python("Analyse.py").' '.$uuidProcess.' "'.$debut.'" "'.$fin.'" '.$moyMob.' "'.$variation.'" '.$periode.' '.$synchro.' '.$capteur0.' '.$capteur1.' '.$capteur2.' '.$capteur3.' '.$capteur4.' '.$capteur5.' > /dev/null 2>&1 &');
}
/* Page : Catalogue des enregistrements */
public function catalogue() {
$this->header() ;
$this->load->view('pages/catalogue');
$this->load->view('fragment/footer');
}
} }
?> ?>
...@@ -35,6 +35,121 @@ ...@@ -35,6 +35,121 @@
</a> </a>
</div> </div>
<div class="col-lg-6 animated fadeInDown" style="margin-bottom:10px;">
<a href= "#" id="extraitVisu">
<div id="menuPrinc5">
<div class="p-m">
<h1 class="m-xs">Prélèvement</h1>
<small class="font-bold no-margins">
Visualisation des données des <strong>6 dernières heures</strong>
</small>
</div>
<div class="flot-chart">
<svg width="100%" height="100%" viewBox="0 0 300 300" preserveAspectRatio="xMaxYMax meet" class="pull-right">
<g transform="translate(-30, 300) scale(0.023, -0.023)"
fill="#08af00" stroke="none">
<path d="M5565 12793 c-437 -20 -955 -111 -1410 -249 -859 -261 -1717 -753
-2352 -1348 -51 -47 -95 -86 -97 -86 -3 0 -122 149 -266 330 -144 182 -282
347 -307 368 -24 20 -68 60 -98 88 -74 70 -128 94 -212 94 -114 0 -208 -61
-264 -169 -33 -64 -36 -151 -43 -1161 -4 -481 -11 -1322 -17 -1869 -5 -546 -8
-995 -6 -997 4 -5 -24 -16 1912 766 270 109 738 298 1040 420 303 122 569 233
591 246 53 30 90 74 122 143 33 72 33 152 -2 262 -29 95 -66 146 -130 184 -36
21 -584 207 -858 292 -49 15 -88 30 -88 33 0 14 236 191 377 283 309 200 595
339 927 449 394 131 768 200 1181 217 512 22 983 -45 1478 -210 372 -123 711
-285 1020 -485 54 -35 100 -64 102 -64 3 0 16 18 30 40 l26 41 79 -56 79 -56
34 53 c231 364 837 1361 831 1367 -13 12 -246 160 -334 213 -431 259 -963 489
-1460 632 -642 185 -1242 258 -1885 229z"/>
<path d="M9310 10957 c0 -8 -16 -125 -35 -259 -36 -246 -187 -1284 -295 -2033
-132 -913 -161 -1115 -181 -1249 -30 -199 -29 -257 6 -329 34 -68 78 -110 152
-144 105 -48 201 -40 295 25 24 17 198 172 387 346 190 173 346 314 347 313 2
-1 10 -47 18 -102 98 -641 32 -1341 -189 -1985 -292 -851 -810 -1542 -1558
-2078 -146 -105 -276 -186 -464 -290 l-152 -84 19 -39 c11 -21 20 -42 20 -46
0 -5 -34 -25 -76 -46 -41 -21 -74 -41 -72 -45 6 -15 731 -1357 750 -1389 l19
-33 62 32 c391 197 862 515 1227 826 792 678 1366 1481 1720 2407 269 705 400
1415 400 2175 0 429 -36 796 -117 1190 -20 96 -38 187 -40 201 l-5 26 264 42
c521 83 548 89 623 125 39 18 90 39 115 46 109 30 184 99 215 196 34 107 -4
239 -88 308 -36 29 -3302 1884 -3349 1902 -12 4 -18 1 -18 -9z"/>
<path d="M4 7453 c-4 -49 -4 -214 0 -368 22 -980 241 -1847 696 -2755 431
-860 1128 -1639 1965 -2197 435 -289 894 -512 1450 -704 91 -32 139 -53 137
-61 -2 -7 -73 -195 -159 -418 -173 -450 -183 -480 -183 -564 0 -76 26 -131 88
-186 26 -23 72 -66 103 -96 96 -92 206 -124 311 -89 58 19 3339 1905 3335
1918 -6 19 -2978 2350 -3024 2372 -102 49 -253 26 -329 -50 -14 -14 -47 -36
-73 -49 -54 -28 -116 -92 -137 -142 -28 -68 -18 -148 77 -580 50 -229 88 -418
85 -421 -7 -7 -353 163 -481 237 -626 361 -1171 883 -1561 1497 -363 571 -573
1185 -660 1928 -14 113 -18 231 -18 476 l-1 326 -149 7 c-82 3 -445 6 -807 6
l-657 0 -8 -87z"/>
</g>
</svg>
</div>
</div>
</a>
</div>
<div class="col-lg-6 animated fadeInDown" style="margin-bottom:10px;">
<a href= "<?php echo base_url() ?>index.php/controller/analyse">
<div id="menuPrinc6">
<div class="p-m">
<h1 class="m-xs">Analyse</h1>
<small class="font-bold no-margins">
<strong>Étude</strong> des valeurs de la valvométrie
</small>
</div>
<div class="flot-chart">
<svg width="100%" height="100%" viewBox="0 0 1000 900" preserveAspectRatio="xMaxYMax meet" class="pull-right">
<g transform="translate(0,880) scale(0.1,-0.1)">
<path style="fill:#796900;" d="M3365 8390 c-611 -54 -1266 -312 -1790 -704 -137 -103 -409 -365
-557 -536 -364 -422 -636 -988 -749 -1555 -51 -255 -63 -383 -63 -675 -1 -344
23 -547 100 -859 258 -1046 987 -1912 1976 -2350 645 -285 1366 -367 2074
-235 522 97 1093 361 1522 703 56 45 105 81 109 81 5 0 425 -417 935 -927
l928 -928 175 175 175 175 -931 931 -931 931 87 109 c393 494 654 1113 741
1759 24 178 24 619 0 828 -47 412 -157 777 -352 1167 -240 479 -588 896 -1021
1222 -501 376 -1133 627 -1713 678 -164 14 -597 20 -715 10z m725 -515 c566
-82 1049 -290 1480 -636 123 -99 351 -322 437 -429 302 -375 507 -794 607
-1241 143 -642 75 -1307 -195 -1902 -394 -867 -1182 -1497 -2119 -1692 -397
-83 -843 -79 -1250 12 -557 123 -1068 402 -1470 803 -867 863 -1119 2176 -634
3300 224 519 617 992 1083 1303 416 278 893 449 1382 497 134 13 553 4 679
-15z"/>
<path style="fill:#796900;" d="M5770 5825 c-47 -13 -366 -98 -710 -189 -344 -92 -632 -169 -639
-172 -10 -3 46 -66 174 -194 l190 -190 -455 -455 -455 -455 -660 660 -660 660
-550 -550 -550 -550 177 -177 178 -178 365 365 c201 201 368 367 371 370 3 2
302 -293 664 -655 l660 -660 635 635 635 635 183 -183 183 -183 58 213 c32
117 91 335 131 483 109 402 205 768 205 782 0 18 -32 15 -130 -12z"/>
</g>
</svg>
</div>
</div>
</a>
</div>
<div class="col-lg-6 animated fadeInDown" style="margin-bottom:10px;">
<a href= "<?php echo base_url() ?>index.php/controller/catalogue">
<div id="menuPrinc7">
<div class="p-m">
<h1 class="m-xs">Catalogue</h1>
<small class="font-bold no-margins">
<strong>Répertoire</strong> des évenements valvométrique disponible
</small>
</div>
<div class="flot-chart">
<svg width="100%" height="100%" viewBox="0 0 1000 900" preserveAspectRatio="xMaxYMax meet" class="pull-right">
<g transform="translate(0,0) scale(2.2,2.2)" style="fill:#bfa3d8" >
<path d="M239.68,0H42.695v368.553h283.164V86.811L239.68,0z M244.057,25.7l56.288,56.701h-56.288V25.7z M57.695,353.553V15
h171.362v82.401h81.802v256.151H57.695V353.553z"/>
<rect x="86.435" y="82.401" width="121.875" height="15"/>
<rect x="86.435" y="151.122" width="195.685" height="15"/>
<rect x="86.435" y="219.843" width="195.685" height="15"/>
<rect x="86.435" y="288.563" width="195.685" height="15"/>
</g>
</svg>
</div>
</div>
</a>
</div>
<div class="col-lg-6 animated fadeInDown" style="margin-bottom:10px;"> <div class="col-lg-6 animated fadeInDown" style="margin-bottom:10px;">
<a href= "<?php echo base_url() ?>index.php/controller/monitoring"> <a href= "<?php echo base_url() ?>index.php/controller/monitoring">
<div id="menuPrinc4"> <div id="menuPrinc4">
...@@ -101,7 +216,9 @@ ...@@ -101,7 +216,9 @@
</div> </div>
</a> </a>
</div> </div>
</div>
</div> </div>
<script> <script>
/** Dessin des figures dans les boutons **/ /** Dessin des figures dans les boutons **/
...@@ -180,4 +297,34 @@ $(document).ready(function(){ ...@@ -180,4 +297,34 @@ $(document).ready(function(){
} }
}); });
}); });
$("#extraitVisu").click(function() {
var uuid = uuidv4();
// Execute le script python
$.ajax({
type: 'post',
data:{ uuid: uuid },
url: '<?php echo base_url();?>index.php/controller/executeExtraitPython',
success: function (results) {},
async: true
});
// Ouvre dans un nouvel onglet sans avoir le "bloque popup"
$.ajax({
url: '<?php echo base_url();?>',
success: function(){window.open('<?php echo base_url();?>index.php/controller/voirGraphique/'+uuid);},
async: false
});
return false;
});
// UUID aleatoire
function uuidv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
</script> </script>
<!-- Page : Visualisation des valeurs en base de donnes -->
<div class="row">
<div class="col-lg-12">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>Recherche</h5>
</div>
<div class="ibox-content">
<div class="input-daterange input-group col-lg-12" id="datepicker">
<input type="date" class="input-sm form-control choix" id="startDate"/>
<input type="time" class="input-sm form-control choix" id="startTime" step="1" id="appt-time"/>
<span class="input-group-addon">à</span>
<input type="date" class="input-sm form-control choix" id="endDate" />
<input type="time" class="input-sm form-control choix" id="endTime" step="1" id="appt-time"/>
</div>
</div>
<div class="ibox-title">
<h5>Graphique Complet</h5>
</div>
<div class="ibox-content">
<div class="row"><h5 class="col-md-2 col-form-label">Moyenne Mobile<!-- (uniquement graphe complet) :--></h5><div class="col-md-2"><input type="number" class="form-control" value="30" id="moyMob"/></div></div>
</div>
<div class="ibox-content">
<div class="row"><h5 class="col-md-2 col-form-label">Variation</h5><div class="col-md-2"><input type="number" class="form-control" value="0.25" id="variation"/></div><div class ="col-md-8 col-sm-8 col-lg-8"><h5>Valeur utilisée pour définir une variation par rapport aux valeurs extrêmes. Par exemple, une valeur de 0.25 prendra en compte toutes les variations de +/- 25% de la différence entre la valeur maximale et la valeur minimale</h5></div></div>
</div>
<div class="ibox-content">
<div class="row"><h5 class="col-md-2 col-form-label">Periode</h5><div class="col-md-2"><input type="number" class="form-control" value="50" id="periode"/></div><div class ="col-md-8 col-sm-8 col-lg-8"><h5>Analyse de la variation sur le nombre de valeur definie (5 = 1 seconde)</h5></div></div>
</div>
<div class="ibox-content">
<div class="row"><h5 class="col-md-2 col-form-label">Synchronisation</h5><div class="col-md-2"><input type="number" class="form-control" value="3" id="synchro"/></div><div class ="col-md-8 col-sm-8 col-lg-8"><h5>Nombre de capteurs minimum synchronisées pour afficher un marqueur sur le graphe</h5></div></div>
</div>
<div class="ibox-content">
<div class="row"><button id="graphCompl" class="col-md-2 col-form-label btn btn-primary dim">Graphique Complet</button></div>
<div class="row col-md-3 col-form-label "><span class="col-md-1 col-form-label badge badge-warning">?</span><p class="col-md-11 text-warning">Limite de 7000000 valeurs (1 à 2 semaine)</p></div>
</div>
</div>
</div>
</div>
<script>
function valeurPresentes() {
return ($("#startDate").val() !== "" && $("#startTime").val() !== "" &&
$("#endDate").val() !== "" && $("#endTime").val() !== "" )
}
// UUID aleatoire
function uuidv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
$("#graphCompl").click(function() {
if (valeurPresentes()) {
ajoutSecondesStart = ""; ajoutSecondesEnd = "";
if ($("#startTime").val().length < 6) { // pour chrome uniquement
ajoutSecondesStart = ':00';
} else {
ajoutSecondesStart = "";
}
if ($("#endTime").val().length < 6) { // pour chrome uniquement
ajoutSecondesEnd = ':00';
} else {
ajoutSecondesEnd = "";
}
var debut = $("#startDate").val()+" "+$("#startTime").val()+ajoutSecondesStart ;
var fin = $("#endDate").val()+" "+$("#endTime").val()+ajoutSecondesEnd ;
var moyMob = $("#moyMob").val();
if(!$.isNumeric(moyMob)){
moyMob = 30;
$("#moyMob").val("30");
}
else if (moyMob < 1){
moyMob = 1;
$("#moyMob").val("1");
}
var synchro = $("#synchro").val();
if(!$.isNumeric(synchro)){
synchro = 3;
$("#synchro").val("3");
}
else if ($("#synchro").val() > 6 || $("#synchro").val() < 1){
synchro = 3;
$("#synchro").val("3");
}
var variation = $("#variation").val();
if(!$.isNumeric(variation)){
variation = 0.25;
$("#variation").val("0.25");
}
else if ($("#variation").val() > 1 || $("#variation").val() < 0){
variation = 0.25;
$("#variation").val("0.25");
}
var periode = $("#periode").val();
if(!$.isNumeric(periode)){
periode = 50;
$("#periode").val("50");
}
else if ($("#periode").val() < 1) {
periode = 50;
$("#periode").val("50");
}
var uuid = uuidv4();
console.log("===========");
console.log(debut);
console.log(fin);
console.log(moyMob);
console.log(variation);
console.log(periode);
console.log(synchro);
// Execute le script python
$.ajax({
type: 'post',
data:{
debut: debut,
fin: fin,
moyMob: moyMob,
variation: variation,
periode: periode,
synchro: synchro,
uuid: uuid
},
url: '<?php echo base_url();?>index.php/controller/executeAnalysePython',
success: function (results) {},
async: true
});
// Ouvre dans un nouvel onglet sans avoir le "bloque popup"
$.ajax({
url: '<?php echo base_url();?>',
success: function(){window.open('<?php echo base_url();?>index.php/controller/voirGraphique/'+uuid);},
async: false
});
return false;
}
});
</script>
<div id="tableauDiv" class="wrapper wrapper-content animated fadeInRight">
<div class="row">
<div class="col-lg-12">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>Catalogue évenementiel</h5>
</div>
<div class="ibox-content">
<div class="table-responsive">
<table id="tableau" class="table table-striped table-bordered table-hover dataTable" >
<thead>
<tr>
<th></th>
<th>Nom</th>
<th>Origine</th>
<th>Visualisation</th>
<th>Date de Début</th>
<th>Date de Fin</th>
<th>Durée</th>
<th>Observation</th>
</tr>
</thead>
<tbody>
<tr id="id1">
<td>1</td>
<td>Changement de casier</td>
<td>SAS Quinette</td>
<td>Analyse</td>
<td>2020-05-20 à 10h</td>
<td>2020-05-20 à 13h</td>
<td>3h</td>
<td><i class="fa fa-check text-navy">Mise a l'eau du casier au SAS Quinette. <br />
Etat des moules:<br />
- A5 morte.<br />
- A0 ouverture très rare.</i>
</td>
</tr>
<tr id="id2">
<td>2</td>
<td>Observation A0</td>
<td>SAS Quinette</td>
<td>Individuelle</td>
<td>2020-05-20 à 13h</td>
<td>2020-05-24 à 01h</td>
<td>84h</td>
<td><i class="fa fa-check text-navy">Mort de A0</i></td>
</tr>
<tr id="id3">
<td>3</td>
<td>Observation Batterie</td>
<td>SAS Quinette</td>
<td>Individuelle</td>
<td>2020-05-24 à 00h</td>
<td>2020-06-07 à 00h</td>
<td>336h</td>
<td><i class="fa fa-check text-navy">2 semaines dont 1 en plein ensoleillement <br />Peu de pertes d'énergie</i></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function(){
initTable();
});
function initTable() {
table = $('.dataTable').DataTable({
pageLength: 25,
responsive: true,
dom: '<"html5buttons"B>lTfgitp',
buttons: [
{extend: 'copy'},
{extend: 'csv'},
{extend: 'excel', title: 'Catalogue'},
{extend: 'pdf', title: 'Catalogue'},
{extend: 'print',
customize: function (win){
$(win.document.body).addClass('white-bg');
$(win.document.body).css('font-size', '10px');
$(win.document.body).find('table')
.addClass('compact')
.css('font-size', 'inherit');
}
}
]
});
}
// UUID aleatoire
function uuidv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
$("#id1").click(function() {
analyse(168, 175, 176, 177, 178, 179, "2020-05-20 10:00:00.000", "2020-05-20 13:00:00.000", 7)
return false;
});
$("#id2").click(function() {
visualisation(168, "Moule A0", "2020-05-20 13:00:00.000", "2020-05-24 01:00:00.000", "G", 7000000, 100)
return false;
});
$("#id3").click(function() {
visualisation(172, "Batterie", "2020-05-24 00:00:00.000", "2020-06-07 00:00:00.000", "G", 7000000, 1)
return false;
});
function analyse(cpt0, cpt1, cpt2, cpt3, cpt4, cpt5, dateDeb, dateFin, syncro) {
var uuid = uuidv4();
$.ajax({
type: 'post',
data:{
capteur0: cpt0,
capteur1: cpt1,
capteur2: cpt2,
capteur3: cpt3,
capteur4: cpt4,
capteur5: cpt5,
debut: dateDeb,
fin: dateFin,
moyMob: 30,
variation: 0.25,
periode: 50,
synchro: syncro,
uuid: uuid
},
url: '<?php echo base_url();?>index.php/controller/executeAnalysePython',
success: function (results) {},
async: true
});
// Ouvre dans un nouvel onglet sans avoir le "bloque popup"
$.ajax({
url: '<?php echo base_url();?>',
success: function(){window.open('<?php echo base_url();?>index.php/controller/voirGraphique/'+uuid);},
async: false
});
return false;
}
function visualisation(id, nom, dateDeb, dateFin, unite, limite, moyMob) {
var uuid = uuidv4();
$.ajax({
type: 'post',
data:{
id: id,
nom: nom,
debut: dateDeb,
fin: dateFin,
unite: unite,
limite: limite,
moyMob: moyMob,
uuid: uuid
},
url: '<?php echo base_url();?>index.php/controller/executePython',
success: function (results) {},
async: true
});
// Ouvre dans un nouvel onglet sans avoir le "bloque popup"
$.ajax({
url: '<?php echo base_url();?>',
success: function(){window.open('<?php echo base_url();?>index.php/controller/voirGraphique/'+uuid);},
async: false
});
return false;
}
</script>
<!-- Page : Visualisation du graphe generee par le script python --> <!-- Page : Visualisation du graphe generee par le script python -->
<h1 id="titre">Visualisation complexe</h1> <h1 id="titre">Graphique Complet</h1>
<div id="zone" class="progress"> <div id="zone" class="progress">
<div id="progress" class="progress-bar progress-bar-striped progress-bar-animated progress-bar-warning" style="width: 0%" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div> <div id="progress" class="progress-bar progress-bar-striped progress-bar-animated progress-bar-warning" style="width: 0%" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div>
</div> </div>
......
...@@ -266,8 +266,8 @@ function majChart(idCapteur, debut, fin, limite=500) { ...@@ -266,8 +266,8 @@ function majChart(idCapteur, debut, fin, limite=500) {
value = valeurs[val].trim(); value = valeurs[val].trim();
var temps = parse.table[val].temps ; var temps = parse.table[val].temps ;
var lat = value.split(",")[0]; var lat = value.split(",")[0].trim();
var lon = value.split(",")[1]; var lon = value.split(",")[1].trim();
if (lat != "-999" && lon != "-999"){ if (lat != "-999" && lon != "-999"){
placeMarker(lat, lon, temps); placeMarker(lat, lon, temps);
} }
......
...@@ -80,6 +80,38 @@ h5 { ...@@ -80,6 +80,38 @@ h5 {
color: #ffffff; color: #ffffff;
} }
#menuPrinc5 {
background-color: #068300;
color: #ffffff;
border-radius: 10px;
}
#menuPrinc5:hover{
background-color: #09bd00;
color: #ffffff;
}
#menuPrinc6 {
background-color: #A79000;
color: #ffffff;
border-radius: 10px;
}
#menuPrinc6:hover{
background-color: #cfc009;
color: #ffffff;
}
#menuPrinc7 {
background-color: #776587;
color: #ffffff;
border-radius: 10px;
}
#menuPrinc7:hover{
background-color: #a78ebd;
color: #ffffff;
}
div.barMenu:before { div.barMenu:before {
content:url('../img/bars.png'); content:url('../img/bars.png');
} }
......
This diff is collapsed.
# Genere une image du graphe avec matplot. Le traitement est suivie dans un fichier texte.
# Argument =>
# 1 = Identifiant unique du processus
# 2 = Date de fin
# 3 = Id Capteur 1
# 4 = Id Capteur 2
# 5 = Id Capteur 3
# 6 = Id Capteur 4
# 7 = Id Capteur 5
# 8 = Id Capteur 6
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import csv
import sys
from datetime import datetime
from datetime import timedelta
import MySQLdb
import atexit
idProcess = sys.argv[1]
sys.stdout = open("/var/www/html/astreos/assets/python/log_"+idProcess+".txt", "w+")
sys.stdout.flush()
x = []
y = []
y1 = []
y2 = []
y3 = []
y4 = []
y5 = []
moy = []
moy1 = []
moy2 = []
moy3 = []
moy4 = []
moy5 = []
#168, 175, 176, 177, 178, 179
ID_CAPTEURS = [int(sys.argv[3]), int(sys.argv[4]), int(sys.argv[5]), int(sys.argv[6]), int(sys.argv[7]), int(sys.argv[8])]
NOM = str("Valvometrie").decode("utf-8")
try:
FIN = datetime.strptime(sys.argv[2], '%Y-%m-%d %H:%M:%S.%f')
except:
FIN = datetime.strptime(sys.argv[2], '%Y-%m-%d %H:%M:%S')
DEBUT = FIN - timedelta(hours=6, minutes=00)
UNITE = "G"
LIMITE = 7000000 # Valeur sur 1 semaine par defaut
CONST_MOYENNE = 30
axeMax = 0
axeMin = 999
axeMax1 = 0
axeMin1 = 999
axeMax2 = 0
axeMin2 = 999
axeMax3 = 0
axeMin3 = 999
axeMax4 = 0
axeMin4 = 999
axeMax5 = 0
axeMin5 = 999
# ================ CONNECTION BDD ================== #
try:
db = MySQLdb.connect(host="localhost",
user="astreos",
passwd="WoHvxE982brBdQG",
db="astreos");
print("msg0_Connexion-BDD")
except Exception as ex:
print("echec_"+str(ex));
sys.stdout.flush()
sys.exit(1)
# ================ RECUPERATION DONNEES ================== #
nbLigne = 0
try:
requete0 = "SELECT temps, valeur FROM valeur WHERE idCapteur = %s AND temps >= %s AND temps <= %s ORDER BY temps ASC LIMIT %s"
data0 = (ID_CAPTEURS[0], str(DEBUT), str(FIN), LIMITE, );
print("msg1_Recuperation-des-valeurs-(Cette-operation-peut-prendre-plusieurs-minutes)...")
sys.stdout.flush()
cursor0 = db.cursor();
nbLigne = cursor0.execute(requete0, data0)
requete1 = "SELECT valeur FROM valeur WHERE idCapteur = %s AND temps >= %s AND temps <= %s ORDER BY temps ASC LIMIT %s"
data1 = (ID_CAPTEURS[1], str(DEBUT), str(FIN), LIMITE, );
cursor1 = db.cursor();
cursor1.execute(requete1, data1)
#print("recup_10")
requete2 = "SELECT valeur FROM valeur WHERE idCapteur = %s AND temps >= %s AND temps <= %s ORDER BY temps ASC LIMIT %s"
data2 = (ID_CAPTEURS[2], str(DEBUT), str(FIN), LIMITE, );
cursor2 = db.cursor();
cursor2.execute(requete2, data2)
#print("recup_20")
requete3 = "SELECT valeur FROM valeur WHERE idCapteur = %s AND temps >= %s AND temps <= %s ORDER BY temps ASC LIMIT %s"
data3 = (ID_CAPTEURS[3], str(DEBUT), str(FIN), LIMITE, );
cursor3 = db.cursor();
cursor3.execute(requete3, data3)
#print("recup_30")
requete4 = "SELECT valeur FROM valeur WHERE idCapteur = %s AND temps >= %s AND temps <= %s ORDER BY temps ASC LIMIT %s"
data4 = (ID_CAPTEURS[4], str(DEBUT), str(FIN), LIMITE, );
cursor4 = db.cursor();
cursor4.execute(requete4, data4)
#print("recup_40")
requete5 = "SELECT valeur FROM valeur WHERE idCapteur = %s AND temps >= %s AND temps <= %s ORDER BY temps ASC LIMIT %s"
data5 = (ID_CAPTEURS[5], str(DEBUT), str(FIN), LIMITE, );
cursor5 = db.cursor();
cursor5.execute(requete5, data5)
#print("recup_50")
except Exception as ex:
print("echec_"+str(ex));
sys.stdout.flush()
db.close()
sys.exit(1)
print(datetime.now())
for i in range(nbLigne):
try:
row = cursor0.fetchone()
x.append(row[0])
y.append(float(row[1]))
y1.append(float(cursor1.fetchone()[0]))
y2.append(float(cursor2.fetchone()[0]))
y3.append(float(cursor3.fetchone()[0]))
y4.append(float(cursor4.fetchone()[0]))
y5.append(float(cursor5.fetchone()[0]))
if i % 10000 == 0:
#print("data_"+str(row[1]))
pourcentage = (i*100)/nbLigne
print("data_"+str(pourcentage))
sys.stdout.flush()
if i >= CONST_MOYENNE :
moyenne = 0
moyenne1 = 0
moyenne2 = 0
moyenne3 = 0
moyenne4 = 0
moyenne5 = 0
for j in range(i-CONST_MOYENNE, i, 1) :
moyenne = moyenne+y[j]
moyenne1 = moyenne1+y1[j]
moyenne2 = moyenne2+y2[j]
moyenne3 = moyenne3+y3[j]
moyenne4 = moyenne4+y4[j]
moyenne5 = moyenne5+y5[j]
moy.append(moyenne / CONST_MOYENNE)
moy1.append(moyenne1 / CONST_MOYENNE)
moy2.append(moyenne2 / CONST_MOYENNE)
moy3.append(moyenne3 / CONST_MOYENNE)
moy4.append(moyenne4 / CONST_MOYENNE)
moy5.append(moyenne5 / CONST_MOYENNE)
if (moyenne / CONST_MOYENNE) > axeMax: axeMax = (moyenne / CONST_MOYENNE)
if (moyenne / CONST_MOYENNE) < axeMin: axeMin = (moyenne / CONST_MOYENNE)
if (moyenne1 / CONST_MOYENNE) > axeMax1: axeMax1 = (moyenne1 / CONST_MOYENNE)
if (moyenne1 / CONST_MOYENNE) < axeMin1: axeMin1 = (moyenne1 / CONST_MOYENNE)
if (moyenne2 / CONST_MOYENNE) > axeMax2: axeMax2 = (moyenne2 / CONST_MOYENNE)
if (moyenne2 / CONST_MOYENNE) < axeMin2: axeMin2 = (moyenne2 / CONST_MOYENNE)
if (moyenne3 / CONST_MOYENNE) > axeMax3: axeMax3 = (moyenne3 / CONST_MOYENNE)
if (moyenne3 / CONST_MOYENNE) < axeMin3: axeMin3 = (moyenne3 / CONST_MOYENNE)
if (moyenne4 / CONST_MOYENNE) > axeMax4: axeMax4 = (moyenne4 / CONST_MOYENNE)
if (moyenne4 / CONST_MOYENNE) < axeMin4: axeMin4 = (moyenne4 / CONST_MOYENNE)
if (moyenne5 / CONST_MOYENNE) > axeMax5: axeMax5 = (moyenne5 / CONST_MOYENNE)
if (moyenne5 / CONST_MOYENNE) < axeMin5: axeMin5 = (moyenne5 / CONST_MOYENNE)
else:
moy.append(float(row[1]))
moy1.append(y1[i])
moy2.append(y2[i])
moy3.append(y3[i])
moy4.append(y4[i])
moy5.append(y5[i])
if float(row[1]) > axeMax: axeMax = float(row[1])
if float(row[1]) < axeMin: axeMin = float(row[1])
if y1[i] > axeMax1: axeMax1 = y1[i]
if y1[i] < axeMin1: axeMin1 = y1[i]
if y2[i] > axeMax2: axeMax2 = y2[i]
if y2[i] < axeMin2: axeMin2 = y2[i]
if y3[i] > axeMax3: axeMax3 = y3[i]
if y3[i] < axeMin3: axeMin3 = y3[i]
if y4[i] > axeMax4: axeMax4 = y4[i]
if y4[i] < axeMin4: axeMin4 = y4[i]
if y5[i] > axeMax5: axeMax5 = y5[i]
if y5[i] < axeMin5: axeMin5 = y5[i]
#i = i+1
except Exception as ex:
print("echec_"+str(ex));
sys.stdout.flush()
while (len(x) != len(moy)) and (len(x) != len(moy1)) and (len(x) != len(moy2)) and (len(x) != len(moy3)) and (len(x) != len(moy4)) and (len(x) != len(moy5)) :
if len(x) < len(moy) : moy.pop()
elif len(x) > len(moy): x.pop()
if len(x) < len(moy1): moy1.pop()
elif len(x) > len(moy1): x.pop()
if len(x) < len(moy2): moy2.pop()
elif len(x) > len(moy2): x.pop()
if len(x) < len(moy3): moy3.pop()
elif len(x) > len(moy3): x.pop()
if len(x) < len(moy4): moy4.pop()
elif len(x) > len(moy4): x.pop()
if len(x) < len(moy5): moy5.pop()
elif len(x) > len(moy5): x.pop()
print(datetime.now())
print("msg2_Creation-du-graphique")
sys.stdout.flush()
try:
plt.figure(figsize=(18.5, 10.5))
plt.suptitle("Astreos")
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d %H:%M:%S.%f'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())
plt.subplot(321)
plt.plot(x, moy, label = NOM) # ancien moule Silicon
plt.ylabel(UNITE)
plt.ylim((axeMin, axeMax))
plt.title('Moule A0')
plt.legend()
plt.subplot(323)
plt.plot(x, moy1, label='Moyenne Mobile')
plt.ylabel(UNITE)
plt.ylim((axeMin1, axeMax1))
plt.title('Moule A1')
plt.subplot(325)
plt.plot(x, moy2, label='Moyenne Mobile')
plt.ylabel(UNITE)
plt.ylim((axeMin2, axeMax2))
plt.xlabel('Temps (heures)')
plt.title('Moule A2')
plt.subplot(322)
plt.plot(x, moy3, label='Moyenne Mobile')
plt.ylabel(UNITE)
plt.ylim((axeMin3, axeMax3))
plt.title('Moule A3')
plt.subplot(324)
plt.plot(x, moy4, label='Moyenne Mobile')
plt.ylabel(UNITE)
plt.ylim((axeMin4, axeMax4))
plt.title('Moule A4')
plt.subplot(326)
plt.plot(x,moy5, label='Moyenne Mobile')
plt.xlabel('Temps (heures)')
plt.ylabel(UNITE)
plt.ylim((axeMin5, axeMax5))
plt.title('Moule A5')
plt.savefig("/var/www/html/astreos/assets/python/"+str(idProcess)+".png", bbox_inches='tight')
print("close_"+str(idProcess))
sys.stdout.flush()
db.close()
except Exception as ex:
print("echec_"+str(ex));
sys.stdout.flush()
db.close()
sys.exit(1)
#plt.show()