예제 #1
0
 /**
  * Update into oko_capteur all capteur in csv file from okofen
  * 
  * @see administration::uploadCsv()
  *
  */
 private function updateMatriceFromFile()
 {
     //translation
     $dico = json_decode(file_get_contents("_langs/fr.matrice.json"), true);
     //open matrice file just uploaded, first line
     $line = fgets(fopen('_tmp/matrice.csv', 'r'));
     //on retire le dernier ; de la ligne
     $line = mb_convert_encoding(substr($line, 0, strlen($line) - 2), 'UTF-8');
     $this->log->debug("Class " . __CLASS__ . " | " . __FUNCTION__ . " | CSV First Line | " . $line);
     $c = new capteur();
     $capteurs = $c->getMatrix();
     $capteursCsv = array();
     $lastColumnOko = $c->getLastColumnOko();
     $query = "";
     $column = explode(CSV_SEPARATEUR, $line);
     //$capteursCsv = array_slice(array_flip($column),2);
     //on deroule la liste des capteurs dans le csv
     //cela va tester le deplacement d'un capteur par rapport à la bdd ou l'ajout d'un capteur
     foreach ($column as $position => $t) {
         //set only capteur not day and hour
         if ($position > 1) {
             $title = trim($t);
             $capteursCsv[$title] = $position;
             //on test si le capteur etait deja connu dans la base oko_capteur
             if (array_key_exists($title, $capteurs)) {
                 //on verifie si la position du capteur a changer, si oui, maj de la bdd
                 if ($capteurs[$title]->position_column_csv !== $position) {
                     $q = "UPDATE oko_capteur set position_column_csv=" . $position . " where id=" . $capteurs[$title]->id . ";";
                     $this->log->debug("Class " . __CLASS__ . " | " . __FUNCTION__ . " | Update oko_capteur | " . $q);
                 }
             } else {
                 //capteur pas connu dans la base, on le met en fin de table  oko_capteur
                 if (isset($dico[$title])) {
                     $name = $dico[$title]['name'];
                     $type = $dico[$title]['type'];
                     $boiler = $dico[$title]['boiler'];
                 } else {
                     $name = $title;
                     $type = "";
                     $boiler = "";
                 }
                 $lastColumnOko++;
                 $addColumn = "ALTER TABLE oko_historique_full ADD COLUMN col_{$lastColumnOko} DECIMAL(6,2) NULL DEFAULT NULL;";
                 $this->log->debug("Class " . __CLASS__ . " | " . __FUNCTION__ . " | Create New oko_capteur | " . $addColumn);
                 $query .= $addColumn;
                 $q = "INSERT INTO oko_capteur(name,position_column_csv,column_oko, original_name,type,boiler) VALUE ('{$name}',{$position},{$lastColumnOko},'{$title}','{$type}','{$boiler}');";
                 $this->log->debug("Class " . __CLASS__ . " | " . __FUNCTION__ . " | Create New oko_capteur | " . $q);
             }
             $query .= $q;
         }
     }
     //on test maintenant le retrait d'un capteur dans le csv par rapport à la base oko_capteur
     $forbidenCapteurs = array_diff_key($capteurs, $capteursCsv);
     foreach ($forbidenCapteurs as $t => $position) {
         //si le capteur n'est plus present dans le csv, on met a jour la table en lui mettant -1 dans sa position_csv
         $title = trim($t);
         $q = "UPDATE oko_capteur set position_column_csv=-1 where id=" . $capteurs[$title]->id . ";";
         $this->log->debug("Class " . __CLASS__ . " | " . __FUNCTION__ . " | Disable oko_capteur | " . $q);
         $query .= $q;
     }
     //on met a jour le startCycle
     $nbColumnCsv = count($column);
     $q = "UPDATE oko_capteur set position_column_csv={$nbColumnCsv} where type = 'startCycle';";
     $query .= $q;
     $result = $this->multi_query($query);
     while ($this->flush_multi_queries()) {
     }
     // flush multi_queries
 }
예제 #2
0
 public function csv2bdd()
 {
     ini_set('max_execution_time', 120);
     $t = new timeExec();
     $ob_capteur = new capteur();
     $capteurs = $ob_capteur->getForImportCsv();
     //l'index du tableau correspond a la colonne du capteur dans le fichier csv
     $capteurStatus = $ob_capteur->getByType('status');
     $startCycle = $ob_capteur->getByType('startCycle');
     unset($ob_capteur);
     $file = fopen(CSVFILE, 'r');
     $ln = 0;
     $old_status = 0;
     $start_cycle = 0;
     $nbColCsv = count($capteurs);
     //$insert = "INSERT IGNORE INTO oko_historique (jour,heure,oko_capteur_id,value) VALUES ";
     $insert = "INSERT IGNORE INTO oko_historique_full SET ";
     while (!feof($file)) {
         $ligne = fgets($file);
         //ne pas prendre en compte la derniere colonne vide
         $ligne = substr($ligne, 0, strlen($ligne) - 2);
         if ($ln != 0) {
             //pour ne pas lire la premiere ligne d'entete du fichier csv
             $colCsv = explode(CSV_SEPARATEUR, $ligne);
             if (isset($colCsv[1])) {
                 //test si ligne non vide
                 //$nbColCsv = count($colCsv);
                 $jour = $colCsv[0];
                 $heure = $colCsv[1];
                 // Round to the minute, since in some cases it is possible to
                 // import two files with the same data but not the same seconds
                 // Case of an import on the same day of the web files and the USB files
                 $heure = preg_replace('/:[0-9]{2}$/', ':00', $heure);
                 $query = "";
                 $beginValue = "jour = STR_TO_DATE('" . $jour . "','%d.%m.%Y')," . "heure = '" . $heure . "'," . "timestamp = UNIX_TIMESTAMP(CONCAT(STR_TO_DATE('" . $jour . "','%d.%m.%Y'),' ','" . $heure . "'))";
                 //utc timestamp
                 $query = $insert . $beginValue;
                 //Detection demarrage d'un cycle //Statut 4 = Debut d'un cycle sur le front montant du statut
                 if ($colCsv[$capteurStatus['position_column_csv']] == "4" && $colCsv[$capteurStatus['position_column_csv']] != $old_status) {
                     $st = 1;
                     //creation de la requette pour le comptage des cycle de la chaudiere
                     //Enregistrement de 1 si nous commençons un cycle d'allumage
                     $query .= ", col_" . $startCycle['column_oko'] . "=" . $st;
                 }
                 //creation de la requette sql pour les capteurs
                 //on commence à la deuxieme colonne de la ligne du csv
                 for ($i = 2; $i <= $nbColCsv; $i++) {
                     $query .= ", col_" . $capteurs[$i]['column_oko'] . "=" . $this->cvtDec($colCsv[$i]);
                 }
                 $query .= ";";
                 //execution de la requette representant l'ensemble d'un ligne du csv
                 $this->log->debug("Class " . __CLASS__ . " | " . __FUNCTION__ . " | " . $query);
                 $this->query($query);
                 $old_status = $colCsv[$capteurStatus['position_column_csv']];
             }
         }
         $ln++;
     }
     fclose($file);
     $this->log->info("Class " . __CLASS__ . " | " . __FUNCTION__ . " | SUCCESS - import du CSV dans la BDD - " . $ln . " lignes en " . $t->getTime() . " sec ");
     return true;
 }
예제 #3
0
<?php

ini_set('max_execution_time', 600);
$this->log->info("UPGRADE | {$version} | begin");
$t = new timeExec();
$dico = json_decode(file_get_contents("_langs/fr.matrice.json"), true);
$c = new capteur();
$res = $c->getAll();
foreach ($res as $key) {
    $okoSensor = $key['original_name'];
    $name = isset($dico[$okoSensor]['name']) ? $dico[$okoSensor]['name'] : $okoSensor;
    $q = "update oko_capteur set name='" . $name . "' where original_name='{$okoSensor}'";
    $this->log->info("UPGRADE | {$version} | update {$okoSensor} :: " . $name);
    if (!$this->query($q)) {
        $this->log->info("UPGRADE | {$version} | Failed | " . $q);
    }
}
$q = "CREATE TABLE IF NOT EXISTS `oko_silo_events` (\n            `id` int(11) NOT NULL AUTO_INCREMENT,\n            `event_date` date NOT NULL,\n            `quantity` int(5) unsigned NOT NULL COMMENT 'in kg',\n            `remaining` int(6) NOT NULL COMMENT 'in kg',\n            `price` int(8) NOT NULL,\n            `event_type` char(10) NOT NULL DEFAULT 'PELLET',\n            PRIMARY KEY (`id`)\n          ) ENGINE=MYISAM DEFAULT CHARSET=utf8";
$this->log->info("UPGRADE | {$version} | Adding table oko_silo_events");
if (!$this->query($q)) {
    $this->log->info("UPGRADE | {$version} | Failed | " . $q);
}
//ajouter dans config.php
// Utilisation d'un silo
$configFile = file_get_contents('config.php');
$configFile = str_replace("//NEWPARAMUPDATE", "// Utilisation d'un silo\nDEFINE('HAS_SILO', (\$" . "config['has_silo']==1)?true:false); // default -> true //json \nDEFINE('SILO_SIZE', \$" . "config['silo_size']); // kg \nDEFINE('ASHTRAY', (isset(\$" . "config['ashtray']))?\$" . "config['ashtray']:''); // kg \n//NEWPARAMUPDATE", $configFile);
file_put_contents('config.php', $configFile);
$this->log->info("UPGRADE | {$version} | end :" . $t->getTime());
예제 #4
0
 public function getNbCycleByDay($jour)
 {
     $c = new capteur();
     $capteur = $c->getByType('startCycle');
     $q = "SELECT sum(a.col_" . $capteur['column_oko'] . ") as nbCycle FROM oko_historique_full as a " . "WHERE a.jour = '" . $jour . "';";
     $this->log->debug("Class " . __CLASS__ . " | " . __FUNCTION__ . " | " . $q);
     $result = $this->query($q);
     return $result->fetch_object();
 }
 public function migrateDataForDate($jour)
 {
     $r['response'] = false;
     $error = false;
     //on recupere la matrice des capteurs
     $ob_capteur = new capteur();
     $capteurs = $ob_capteur->getForImportCsv();
     //l'index du tableau correspond a la colonne du capteur dans le fichier csv
     $insert = "INSERT IGNORE INTO oko_historique_full set jour = '" . $jour . "'";
     //puis apres le jour, les minutes present pour le jour en cours
     $qHeure = "select distinct(heure) from oko_historique where jour = '" . $jour . "' group by heure";
     $resHeure = $this->query($qHeure);
     while ($rHeure = $resHeure->fetch_object()) {
         $set = ", heure = '" . $rHeure->heure . "'";
         //puis pour chaque minutes on recupere pour chaque capteur
         foreach ($capteurs as $positionCsv => $capteur) {
             $qCapteur = "select value from oko_historique where jour ='" . $jour . "' AND heure ='" . $rHeure->heure . "' AND oko_capteur_id=" . $capteur['id'];
             //$this->log->debug("_UPGRADE | ".$qCapteur);
             $resCapteur = $this->query($qCapteur);
             $rCapteur = $resCapteur->fetch_object();
             if ($rCapteur == null) {
                 $value = 'null';
             } else {
                 $value = $rCapteur->value;
             }
             $set .= ", col_" . $positionCsv . "=" . $value;
         }
         //$this->log->debug("_UPGRADE | ".$insert.$set);
         if (!$this->query($insert . $set)) {
             $this->log->debug("Class " . __CLASS__ . " | " . __FUNCTION__ . " | " . $insert . $set);
             $error = true;
         }
     }
     //on supprime la ligne dans oko_historique si pas d'erreur lors de la migration de la journéee
     if (!$error) {
         $q = "delete from oko_historique where jour = '" . $jour . "'";
         if ($this->query($q)) {
             $r['response'] = true;
         }
     }
     $this->sendResponse($r);
 }