. */ /* * ***************************Includes********************************* */ require_once dirname(__FILE__) . '/../../../../core/php/core.inc.php'; class energy extends eqLogic { /* * *************************Attributs****************************** */ /* * ***********************Méthodes statiques*************************** */ public static function getConfEnergyKey($_confEnergy, $_position = 0) { $key = ''; if (isset($_confEnergy['power']) && $_confEnergy['power'] != '') { preg_match_all("/#([0-9]*)#/", $_confEnergy['power'], $matches); foreach ($matches[1] as $cmd_id) { $key .= '#' . $cmd_id . '#'; } } if (isset($_confEnergy['consumption']) && $_confEnergy['consumption'] != '') { preg_match_all("/#([0-9]*)#/", $_confEnergy['consumption'], $matches); foreach ($matches[1] as $cmd_id) { $key .= '#' . $cmd_id . '#'; } } if ($key === '') { $key = $_position; } return $key; } public static function cron15($dateF='Y-m-d H:i:00') { $datetime = date($dateF); //$today = date('Y-m-d 0:0:00'); $powerTotal = 0; log::add('energy', 'debug', '----------------CRON 15----------------------' . $datetime); //on parcours tous les éléments du plugins foreach (self::byType('energy',true) as $energy) { if ($energy->getConfiguration('type') == 'electricity') { $totalConsumption = 0; $power = 0; $consumptions = array('other' => 0, 'light' => 0, 'multimedia' => 0, 'heating' => 0, 'electrical' => 0, 'automatism' => 0, 'hc' => 0, 'hp' => 0); //j'ai enlever le hp hc , a valider ? $powers = array('other' => 0, 'light' => 0, 'multimedia' => 0, 'heating' => 0, 'electrical' => 0, 'automatism' => 0); $position = 0; //on recupère la dernière puissance cumul de l'histo (la valeur actuelle en fait :) ) $cmd=$energy->getCmd(null, 'powerCumul'); $lastPowerCumul=0; if (is_object($cmd)) { $lastPowerCumul = $cmd->execCmd(); } log::add('energy', 'debug', '> Equipement de type électrique : ' . $energy->getHumanName()); //on parcours les sous catégories foreach ($energy->getConfiguration('confEnergy') as $confEnergy) { log::add('energy', 'debug', ' > Sous-Catégorie de l\'équipement: ' . $confEnergy['category']); $key = self::getConfEnergyKey($confEnergy, $position); if ($confEnergy['power'] != '') { $value = floatval(jeedom::evaluateExpression($confEnergy['power'])); $power += $value; $powers[$confEnergy['category']]+=$value; //pour le cumul de puissance log::add('energy', 'debug', ' > Puissance constatée : ' . $value. ' W - Cumul des puissances parcourues (ttes ss-cat : ' . $power . ' W)'); // if ($confEnergy['consumption'] == '') { // $nowtime = strtotime('now'); // $today = strtotime('now'); // date_time_set($today,0,0,0); // $lastChange = $energy->getConfiguration('lastChangeTime' . $key); // $lastValue = $energy->getConfiguration('lastValue' . $key); // $consumptions[$confEnergy['category']] += (($lastValue * ($nowtime - $lastChange)) / 3600) / 1000; // //on prend le relevé de puissance du précédent con15 et on le lisse sur les 15min passé // $energy->setConfiguration('lastChangeTime' . $key, $nowtime); // $energy->setConfiguration('lastValue' . $key, $value); // $cmd = $energy->getCmd(null, 'consumption' . $confEnergy['category']); // if (is_object($cmd) && $consumptions[$confEnergy['category']] != 0) { // $cmd->setCollectDate($today); // $cmd->event($consumptions[$confEnergy['category']]); // } // log::add('energy', 'debug', ' > Update de la consommation de la categorie (via calcul) : ' . $consumptions[$confEnergy['category']] . ' kWh'); // } } //code a revoir // if ($confEnergy['consumption'] != '') { // //$previous = $energy->getConfiguration('previous' . $key, 0); // $value = floatval(jeedom::evaluateExpression($confEnergy['consumption'])); // $consumptions[$confEnergy['category']] += $value; // $energy->setConfiguration('previous' . $key, $value); // log::add('energy', 'debug', ' > Update de la consommation de la categorie (via relevé) : ' . $consumptions[$confEnergy['category']] . ' kWh'); // } $position++; } $energy->save(); //pour chaque categorie on va calculer la puissuance cumul (on prend l'ancienne et on ajoute la nouvelle) log::add('energy', 'debug', ' > Update des Puissance Cumul'); foreach ($powers as $name => $power_v) { $cmd = $energy->getCmd(null, 'powerCumul' . ucfirst($name)); if (is_object($cmd)) { $previous_puissance_cumul = $cmd->execCmd(); if(!is_numeric($previous_puissance_cumul)){ $previous_puissance_cumul=0; } $cmd->setCollectDate($datetime); $newValeur=($previous_puissance_cumul + $power_v); $cmd->event($newValeur,$datetime); log::add('energy', 'debug', ' > Update de la puissance cumul ' . $name . ' -> ' . $newValeur . ' W'); } } //pour le calcul de la consommation //on va completement ignorer pour l'instant la déclaration de la consommation //on va la calculer via la puissance cumul //on prend la date du premier enregistrement //la date du dernier //on en deduit le délais d'observation //on prend la derniere puissance cumul, on la ramene a 1H (regle de 3 avec le délais connu) log::add('energy', 'debug', ' > Update des Consommations'); foreach ($consumptions as $name => $consumption) { if ($energy->getConfiguration('totalCounter') == 0) { //on ignore les compteurs $cmd = $energy->getCmd(null, 'powerCumul' . ucfirst($name)); $cmd2 = $energy->getCmd(null, 'consumption' . ucfirst($name)); if (is_object($cmd)) { $historique = $cmd->getHistory(); if(count($historique)>0){ $first_value=$historique[0]->getDatetime(); $timestamp1 = strtotime($first_value); $timestamp2 = strtotime($datetime); $diff = abs($timestamp1-$timestamp2)/(60*60); $last_cumul_value = $cmd->execCmd(); if($diff ==0){ $consommation_cal=0; }else{ $consommation_cal=$last_cumul_value/$diff/1000; } log::add('energy', 'debug', ' > Update Consommation ' . $name . ' : ' . $consommation_cal . ' kWh (Puissance Cumulé de ' . round($last_cumul_value,2) . ' W sur une durée constatée de ' . round($diff,2) . ' Heures )' ); $cmd2->setCollectDate($datetime); $cmd2->event($consommation_cal,$datetime); $totalConsumption += $consommation_cal; } } } } log::add('energy', 'debug', ' > Update de la consommation TOTALE : ' . round($totalConsumption,2) . ' kWh'); if ($consumptions['hc'] > 0) { $cmd = $energy->getCmd(null, 'consumptionHc'); if (is_object($cmd)) { $previous = $cmd->execCmd(); if(!is_numeric($previous)){ $previous=0; } $cmd->setCollectDate($datetime); log::add('energy', 'debug', 'HC : ' . $consumptions['hc'] . '+' . $previous); $cmd->event($consumptions['hc'] + $previous,$datetime); } } if ($consumptions['hp'] > 0) { $cmd = $energy->getCmd(null, 'consumptionHp'); if (is_object($cmd)) { $previous = $cmd->execCmd(); if(!is_numeric($previous)){ $previous=0; } $cmd->setCollectDate($datetime); log::add('energy', 'debug', 'HP : ' . $consumptions['hp'] . '+' . $previous); $cmd->event($consumptions['hp'] + $previous,$datetime); } } if ($totalConsumption > 0) { $cmd = $energy->getCmd(null, 'consumptionTotal'); if (is_object($cmd)) { // $previous = $cmd->execCmd(); $cmd->setCollectDate($datetime); // $newValeur=($totalConsumption + $previous)/2; log::add('energy', 'debug', ' > consommation Totale : (' . $totalConsumption . ')'); //log::add('energy', 'debug', ' > consommation Totale : (' . $totalConsumption . ' + ' . $previous . ')/2 = ' . $newValeur); $cmd->event($totalConsumption,$datetime); } $calculCost = 0; if (config::byKey('rateMode', 'energy') == 'variable') { if ($consumptions['hp'] != 0 || $consumptions['hp'] != 0) { $calculCost = $consumptions['hp'] * str_replace(',', '.', config::byKey('rateHp', 'energy')) + $consumptions['hc'] * str_replace(',', '.', config::byKey('rateHc', 'energy')); } else { $rateHour = array( 'startHp' => intval(ltrim(str_replace(':', '', config::byKey('startHc', 'energy', -1)), '0')), 'endHp' => intval(ltrim(str_replace(':', '', config::byKey('endHc', 'energy', -1)), '0')), 'startHp2' => intval(ltrim(str_replace(':', '', config::byKey('startHc2', 'energy'-1)), '0')), 'endHp2' => intval(ltrim(str_replace(':', '', config::byKey('endHc2', 'energy', -1)), '0')), 'startHp3' => intval(ltrim(str_replace(':', '', config::byKey('startHc3', 'energy', -1)), '0')), 'endHp3' => intval(ltrim(str_replace(':', '', config::byKey('endHc3', 'energy', -1)), '0')), 'rateHp' => str_replace(',', '.', config::byKey('rateHp', 'energy', 0)), 'rateHc' => str_replace(',', '.', config::byKey('rateHc', 'energy', 0)), ); $hourtime = date('Gi', strtotime($datetime)); if ($hourtime >= $rateHour['startHp'] && $hourtime <= $rateHour['endHp'] && $rateHour['startHp'] !== '' && $rateHour['endHp'] !== '') { $calculCost = $totalConsumption * $rateHour['rateHc']; } if ($hourtime >= $rateHour['startHp2'] && $hourtime <= $rateHour['endHp2'] && $rateHour['startHp2'] !== '' && $rateHour['endHp2'] !== '') { $calculCost = $totalConsumption * $rateHour['rateHc']; } if ($hourtime >= $rateHour['startHp3'] && $hourtime <= $rateHour['endHp3'] && $rateHour['startHp3'] !== '' && $rateHour['endHp3'] !== '') { $calculCost = $totalConsumption * $rateHour['rateHc']; } if ($calculCost == 0) { $calculCost = $totalConsumption * $rateHour['rateHp']; } } } else { $cost = jeedom::evaluateExpression(str_replace(',', '.', config::byKey('rate', 'energy', 0))); $calculCost = $totalConsumption * $cost; } $cmd = $energy->getCmd(null, 'cost'); if (is_object($cmd)) { $previous = $cmd->execCmd(); if(!is_numeric($previous)){ $previous=0; } $cmd->setCollectDate($datetime); $cmd->event($calculCost + $previous,$datetime); } } //update de la puissance de l'eq $cmd = $energy->getCmd(null, 'power'); if (is_object($cmd)) { $cmd->setCollectDate($datetime); $cmd->event($power); log::add('energy', 'debug', ' > Update de la puissance de l\'équipement : ' . $power . ' W'); } //update des puissance cumul $cmd = $energy->getCmd(null, 'powerCumul'); if (is_object($cmd)) { $cmd->setCollectDate($datetime); $cmd->event($power); log::add('energy', 'debug', ' > Update de la puissance Cumul de l\'équipement : ' . $power . ' W'); } } else { log::add('energy', 'debug', '> Equipement de type NON électrique : ' . $energy->getHumanName()); $totalConsumption = 0; $position = 0; foreach ($energy->getConfiguration('confEnergy') as $confEnergy) { $key = self::getConfEnergyKey($confEnergy, $position); $previous = $energy->getConfiguration('previous' . $key, 0); if(!is_numeric($previous)){ $previous=0; } $value = floatval(evaluate(cmd::cmdToValue($confEnergy['consumption']))); if (($value - $previous) >= 0) { $totalConsumption += ($value - $previous); $energy->setConfiguration('previous' . $key, $value); } $position++; } $energy->save(); if ($totalConsumption > 0) { $cmd = $energy->getCmd(null, 'consumptionTotal'); if (is_object($cmd)) { $previous = $cmd->execCmd(); if(!is_numeric($previous)){ $previous=0; } $cmd->setCollectDate($datetime); $cmd->event($totalConsumption + $previous); } $cost = $cost = jeedom::evaluateExpression(str_replace(',', '.', config::byKey('rate' . ucfirst($energy->getConfiguration('type')), 'energy', 0))); $calculCost = $totalConsumption * $cost; $cmd = $energy->getCmd(null, 'cost'); if (is_object($cmd)) { $previous = $cmd->execCmd(); if(!is_numeric($previous)){ $previous=0; } $cmd->setCollectDate($datetime); $cmd->event($calculCost + $previous); } } } } log::add('energy', 'debug', '----------------FIN CRON 15----------------------'); } public static function cronDaily() { sleep(60); $datetime = date('Y-m-d 00:00:00'); foreach (self::byType('energy',true) as $energy) { $cmd = $energy->getCmd(null, 'cost'); if (is_object($cmd)) { $cmd->setCollectDate($datetime); $cmd->event(0); } $cmd = $energy->getCmd(null, 'consumptionOther'); if (is_object($cmd)) { $cmd->setCollectDate($datetime); $cmd->event(0); } $cmd = $energy->getCmd(null, 'consumptionLight'); if (is_object($cmd)) { $cmd->setCollectDate($datetime); $cmd->event(0); } $cmd = $energy->getCmd(null, 'consumptionMultimedia'); if (is_object($cmd)) { $cmd->setCollectDate($datetime); $cmd->event(0); } $cmd = $energy->getCmd(null, 'consumptionAutomatism'); if (is_object($cmd)) { $cmd->setCollectDate($datetime); $cmd->event(0); } $cmd = $energy->getCmd(null, 'consumptionElectrical'); if (is_object($cmd)) { $cmd->setCollectDate($datetime); $cmd->event(0); } $cmd = $energy->getCmd(null, 'consumptionHeating'); if (is_object($cmd)) { $cmd->setCollectDate($datetime); $cmd->event(0); } $cmd = $energy->getCmd(null, 'consumptionTotal'); if (is_object($cmd)) { $cmd->setCollectDate($datetime); $cmd->event(0); } $cmd = $energy->getCmd(null, 'consumptionHp'); if (is_object($cmd)) { $cmd->setCollectDate($datetime); $cmd->event(0); } $cmd = $energy->getCmd(null, 'consumptionHc'); if (is_object($cmd)) { $cmd->setCollectDate($datetime); $cmd->event(0); } } } public static function getGraph($_startTime = null, $_endTime = null, $_object_id, $_energyType = 'electricity') { log::add('energy', 'debug', '> getGraph================= ' . $_energyType . ' - ' . $_startTime. ' - ' . $_endTime); $return = array( 'category' => array('other' => array(), 'light' => array(), 'multimedia' => array(), 'heating' => array(), 'electrical' => array(), 'automatism' => array()), 'cost' => array(), 'totalConsumption' => array(), 'translation' => array('other' => __('Autre', __FILE__), 'light' => __('Lumière', __FILE__), 'multimedia' => __('Multimedia', __FILE__), 'heating' => __('Chauffage', __FILE__), 'electrical' => __('Electroménager', __FILE__), 'automatism' => __('Automatisme', __FILE__)), 'object' => array(), 'total' => array('power' => 0, 'consumption' => 0, 'cost' => 0), 'consumptionUnite' => 'kWh', 'power' => array() ); if ($_energyType == 'water') { $return['consumptionUnite'] = 'L'; } $object = jeeObject::byId($_object_id); log::add('energy', 'debug', ' > Start with obj : ' . $object->getName()); if (!is_object($object)) { throw new Exception(__('Objet non trouvé. Vérifiez l\'id : ', __FILE__) . $_object_id); } $objects = $object->getChilds(); $objects[] = $object; $oneCompteurIsTotal=false; log::add('energy', 'debug', ' > boucle mère'); foreach ($objects as $object) { log::add('energy', 'debug', '_'); log::add('energy', 'debug', ' > ' . $object->getName()); $return['object'][$object->getName()] = array(); $return['power'][$object->getName()] = array(); foreach ($object->getEqLogic(true, false, 'energy') as $energy) { log::add('energy', 'debug', ' > ' . $energy->getName()); if ($energy->getConfiguration('type') != $_energyType) { continue; } $cmd = $energy->getCmd(null, 'power'); if (is_object($cmd)) { $return['total']['power'] += $cmd->execCmd(); foreach ($cmd->getHistory($_startTime, date('Y-m-d 23:59:59', strtotime($_endTime))) as $value) { $datetime = floatval(strtotime($value->getDatetime() . " UTC")) * 1000; if (isset($return['power'][$object->getName()][$datetime])) { $return['power'][$object->getName()][$datetime][1] += floatval($value->getValue()); } else { $return['power'][$object->getName()][$datetime] = array($datetime, floatval($value->getValue())); } } } // $cmd = $energy->getCmd(null, 'consumptionTotal'); // if (is_object($cmd)) { // if($oneCompteurIsTotal==false && $energy->getConfiguration('totalCounter') == 0){ // log::add('energy', 'debug', ' > update totalConsumption with consumption of this object'); // foreach ($cmd->getHistory($_startTime, date('Y-m-d 23:59:59', strtotime($_endTime))) as $value) { // $datetime = floatval(strtotime($value->getDatetime() . " UTC")) * 1000; // if (isset($return['totalConsumption'][$datetime])) { // $return['totalConsumption'][$datetime][1] += floatval($value->getValue()); // log::add('energy', 'debug', ' > (' . $datetime . ') + ' .$value->getValue() . ' - =' . $return['totalConsumption'][$datetime][1] ); // } else { // $return['totalConsumption'][$datetime] = array($datetime, floatval($value->getValue())); // log::add('energy', 'debug', ' > INIT (' . $datetime . ') = ' .$value->getValue() . ' - =' . $return['totalConsumption'][$datetime][1] ); // } // } // }else{ // log::add('energy', 'debug', ' > DON\'T update totalConsumption with consumption of this object because there is a total compteur'); // } // } foreach ($energy->getData($_startTime, $_endTime) as $key => $values) { foreach ($values as $value) { if (!is_numeric($value[1]) || $value[1] == 0) { if (!is_numeric($value[1])){ log::add('energy', 'debug', ' > NON NUMERIC : ' . $key . ' - ' .$value[0]); } continue; } $value[0] = floatval(strtotime($value[0] . " UTC")) * 1000; if ($key == 'cost') { $return['total']['cost'] += floatval($value[1]); if (isset($return['cost'][$value[0]])) { $return['cost'][$value[0]][1] += floatval($value[1]); } else { $return['cost'][$value[0]] = array($value[0], floatval($value[1])); } continue; } $return['total']['consumption'] += floatval($value[1]); if (isset($return['category'][$key][$value[0]])) { $return['category'][$key][$value[0]][1] += floatval($value[1]); log::add('energy', 'debug', ' > + ' . $value[1] . ' = ' . $return['category'][$key][$value[0]][1]); } else { $return['category'][$key][$value[0]] = array($value[0], floatval($value[1])); log::add('energy', 'debug', ' > = ' . $value[1] . ' = ' . $return['category'][$key][$value[0]][1]); } log::add('energy', 'debug', ' > update object consumption'); if (isset($return['object'][$object->getName()][$value[0]])) { $return['object'][$object->getName()][$value[0]][1] += floatval($value[1]); } else { $return['object'][$object->getName()][$value[0]] = array($value[0], floatval($value[1])); } if($oneCompteurIsTotal==false && $energy->getConfiguration('totalCounter') == 0){ log::add('energy', 'debug', ' > update total consumption'); if (isset($return['totalConsumption'][$value[0]])) { $return['totalConsumption'][$value[0]][1] += floatval($value[1]); log::add('energy', 'debug', ' > (' . $value[0] . ') + ' .$value[1] . ' - =' . $return['totalConsumption'][$value[0]][1] ); } else { $return['totalConsumption'][$value[0]] = array($value[0], floatval($value[1])); log::add('energy', 'debug', ' > INIT (' . $value[0] . ') = ' .$value[1] . ' - =' . $return['totalConsumption'][$value[0]][1] ); } }else{ if($oneCompteurIsTotal){ log::add('energy', 'debug', ' > DON\'t update total consumption - there is a totalCounter'); } if($energy->getConfiguration('totalCounter') == 1){ log::add('energy', 'debug', ' > DON\'t update total consumption - is totalCounter'); } } } } } log::add('energy', 'debug', ' > boucle 2 [calcul de la conso total si compteur total]'); foreach ($object->getEqLogic(true, false, 'energy') as $energy) { if ($energy->getConfiguration('type') == $_energyType && $energy->getConfiguration('totalCounter') == 1) { log::add('energy', 'debug', ' > compteur TOTAL détecté ! la consommation totale va être mise a zero et sera uniquement calculée via cet objet !'); log::add('energy', 'debug', ' > init totalConsumption'); $oneCompteurIsTotal=true; $return['totalConsumption'] = array(); $return['cost'] = array(); $cmd = $energy->getCmd(null, 'consumptionTotal'); if (is_object($cmd)) { log::add('energy', 'debug', ' > iscmd consumptionTotal ok'); $return['total']['consumption'] = 0; foreach ($cmd->getHistoryEnergy($_startTime, $_endTime) as $value) { if (!is_numeric($value[1]) || $value[1] == 0) { continue; } $value[0] = floatval(strtotime($value[0] . " UTC")) * 1000; if (isset($return['totalConsumption'][$value[0]])) { $return['totalConsumption'][$value[0]][1] += floatval($value[1]); log::add('energy', 'debug', ' > (' . $value[0] . ') + ' .$value[1] . ' - =' . $return['totalConsumption'][$value[0]][1] ); } else { $return['totalConsumption'][$value[0]] = array($value[0], floatval($value[1])); log::add('energy', 'debug', ' > (' . $value[0] . ') + ' .$value[1] . ' - =' . $return['totalConsumption'][$value[0]][1] ); } $return['total']['consumption'] += floatval($value[1]); } }else{ log::add('energy', 'debug', ' > iscmd consumptionTotal KO'); } $cmd = $energy->getCmd(null, 'cost'); if (is_object($cmd)) { log::add('energy', 'debug', ' > iscmd cost ok'); $return['total']['cost'] = 0; foreach ($cmd->getHistoryEnergy($_startTime, $_endTime) as $value) { if (!is_numeric($value[1]) || $value[1] == 0) { log::add('energy', 'debug', ' > null/0'); continue; } $value[0] = floatval(strtotime($value[0] . " UTC")) * 1000; log::add('energy', 'debug', ' > ' . $value[0] . ' - ' . $value[1]); if (isset($return['cost'][$value[0]])) { $return['cost'][$value[0]][1] += floatval($value[1]); } else { $return['cost'][$value[0]] = array($value[0], floatval($value[1])); } $return['total']['cost'] += floatval($value[1]); } }else{ log::add('energy', 'debug', ' > iscmd cost KO'); } break; } } } if (isset($return['totalConsumption'])) { sort($return['totalConsumption']); $return['totalConsumption'] = array_values($return['totalConsumption']); } if (isset($return['cost'])) { sort($return['cost']); $return['cost'] = array_values($return['cost']); } foreach ($return['power'] as &$value) { sort($value); $value = array_values($value); } foreach ($return['category'] as &$value) { sort($value); $value = array_values($value); } foreach ($return['object'] as &$value) { sort($value); $value = array_values($value); } $return['total']['consumption'] = round($return['total']['consumption'], 2); $return['total']['cost'] = round($return['total']['cost'], 2); log::add('energy', 'debug', '=====recap total consumption'); // foreach ($return['totalConsumption'] as $value) { // log::add('energy', 'debug', ' > ' . $value[0] . ' - ' .$value[1]); // } log::add('energy', 'debug', 'end get greph-----------------------'); return $return; } function sort_array_obj($a, $b) { if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1; } /* * *********************Méthodes d'instance************************* */ public function getData($_startTime = null, $_endTime = null) { $return = array('other' => array(), 'light' => array(), 'multimedia' => array(), 'heating' => array(), 'electrical' => array(), 'automatism' => array(), 'cost' => array()); $cmd = $this->getCmd(null, 'consumptionOther'); if (is_object($cmd)) { $return['other'] = $cmd->getHistoryEnergy($_startTime, $_endTime); } $cmd = $this->getCmd(null, 'consumptionLight'); if (is_object($cmd)) { $return['light'] = $cmd->getHistoryEnergy($_startTime, $_endTime); } $cmd = $this->getCmd(null, 'consumptionMultimedia'); if (is_object($cmd)) { $return['multimedia'] = $cmd->getHistoryEnergy($_startTime, $_endTime); } $cmd = $this->getCmd(null, 'consumptionAutomatism'); if (is_object($cmd)) { $return['automatism'] = $cmd->getHistoryEnergy($_startTime, $_endTime); } $cmd = $this->getCmd(null, 'consumptionElectrical'); if (is_object($cmd)) { $return['electrical'] = $cmd->getHistoryEnergy($_startTime, $_endTime); log::add('energy', 'debug', ' > electrical ' . $_startTime . ' - ' . $_endTime . ' - ' . count($return['electrical'])); } $cmd = $this->getCmd(null, 'consumptionHeating'); if (is_object($cmd)) { $return['heating'] = $cmd->getHistoryEnergy($_startTime, $_endTime); } $cmd = $this->getCmd(null, 'cost'); if (is_object($cmd)) { $return['cost'] = $cmd->getHistoryEnergy($_startTime, $_endTime); } return $return; } public function emptyHistory() { foreach ($this->getCmd('info') as $cmd) { history::emptyHistory($cmd->getId()); $cmd->save(); $cmd->event(0); } foreach ($this->getConfiguration('confEnergy') as $confEnergy) { $key = self::getConfEnergyKey($confEnergy); if ($this->getConfiguration('type') == 'electricity') { $this->setConfiguration('lastChangeTime' . $key, strtotime('now')); $this->setConfiguration('lastValue' . $key, 0); if ($confEnergy['consumption'] != '') { $this->setConfiguration('previous' . $key, floatval(evaluate(cmd::cmdToValue($confEnergy['consumption'])))); } } else { if ($confEnergy['consumption'] != '') { $this->setConfiguration('previous' . $key, floatval(evaluate(cmd::cmdToValue($confEnergy['consumption'])))); } } } $this->save(); } public function preInsert() { $this->setConfiguration('visiblePower', 1); $this->setConfiguration('visibleCost', 1); $this->setConfiguration('visibleConsumptionTotal', 1); } public function preUpdate() { if ($this->getConfiguration('type') == '') { throw new Exception('Le type ne peut pas être vide'); } $this->setCategory('energy', 1); } public function postSave() { $cmd = $this->getCmd(null, 'cost'); if (!is_object($cmd)) { $cmd = new energyCmd(); $cmd->setLogicalId('cost'); $cmd->setName(__('Coût', __FILE__)); $cmd->setTemplate('dashboard', 'tile'); } $cmd->setEqLogic_id($this->getId()); $cmd->setType('info'); $cmd->setSubType('numeric'); $cmd->setUnite(config::byKey('currency', 'energy', '€')); $cmd->setIsVisible($this->getConfiguration('visibleCost', 0)); $cmd->setIsHistorized(1); $cmd->save(); $unite = ''; if ($this->getConfiguration('type') == 'electricity') { $unite = 'kWh'; } elseif ($this->getConfiguration('type') == 'water') { $unite = 'L'; } elseif ($this->getConfiguration('type') == 'gas') { $unite = 'kWh'; } $cmd = $this->getCmd(null, 'consumptionTotal'); if (!is_object($cmd)) { $cmd = new energyCmd(); $cmd->setLogicalId('consumptionTotal'); $cmd->setTemplate('dashboard', 'tile'); $cmd->setConfiguration('historizeMode', 'max'); $cmd->setIsHistorized(1); } $cmd->setName(__('Consommation', __FILE__)); $cmd->setEqLogic_id($this->getId()); $cmd->setType('info'); $cmd->setSubType('numeric'); $cmd->setUnite($unite); $cmd->setIsVisible($this->getConfiguration('visibleConsumptionTotal', 0)); $cmd->save(); if ($this->getConfiguration('type') == 'electricity') { $cmd = $this->getCmd(null, 'power'); if (!is_object($cmd)) { $cmd = new energyCmd(); $cmd->setLogicalId('power'); $cmd->setName(__('Puissance', __FILE__)); $cmd->setTemplate('dashboard', 'tile'); } $cmd->setEqLogic_id($this->getId()); $cmd->setType('info'); $cmd->setSubType('numeric'); $cmd->setUnite('W'); $cmd->setIsHistorized(1); $cmd->setIsVisible($this->getConfiguration('visiblePower', 0)); $cmd->save(); $cmd = $this->getCmd(null, 'powerCumul'); if (!is_object($cmd)) { $cmd = new energyCmd(); $cmd->setLogicalId('powerCumul'); $cmd->setName(__('Puissance Cumulée', __FILE__)); $cmd->setTemplate('dashboard', 'tile'); } $cmd->setEqLogic_id($this->getId()); $cmd->setType('info'); $cmd->setSubType('numeric'); $cmd->setUnite('W'); $cmd->setIsHistorized(1); $cmd->setIsVisible(0); $cmd->save(); $cmd = $this->getCmd(null, 'powerCumulLight'); if (!is_object($cmd)) { $cmd = new energyCmd(); $cmd->setLogicalId('powerCumulLight'); $cmd->setName(__('Puissance Cumulée Lumière', __FILE__)); $cmd->setTemplate('dashboard', 'tile'); } $cmd->setEqLogic_id($this->getId()); $cmd->setType('info'); $cmd->setSubType('numeric'); $cmd->setUnite('W'); $cmd->setIsHistorized(1); $cmd->setIsVisible(0); $cmd->save(); $cmd = $this->getCmd(null, 'powerCumulOther'); if (!is_object($cmd)) { $cmd = new energyCmd(); $cmd->setLogicalId('powerCumulOther'); $cmd->setName(__('Puissance Cumulée Autre', __FILE__)); $cmd->setTemplate('dashboard', 'tile'); } $cmd->setEqLogic_id($this->getId()); $cmd->setType('info'); $cmd->setSubType('numeric'); $cmd->setUnite('W'); $cmd->setIsHistorized(1); $cmd->setIsVisible(0); $cmd->save(); $cmd = $this->getCmd(null, 'powerCumulMultimedia'); if (!is_object($cmd)) { $cmd = new energyCmd(); $cmd->setLogicalId('powerCumulMultimedia'); $cmd->setName(__('Puissance Cumulée Multimedia', __FILE__)); $cmd->setTemplate('dashboard', 'tile'); } $cmd->setEqLogic_id($this->getId()); $cmd->setType('info'); $cmd->setSubType('numeric'); $cmd->setUnite('W'); $cmd->setIsHistorized(1); $cmd->setIsVisible(0); $cmd->save(); $cmd = $this->getCmd(null, 'powerCumulAutomatism'); if (!is_object($cmd)) { $cmd = new energyCmd(); $cmd->setLogicalId('powerCumulAutomatism'); $cmd->setName(__('Puissance Cumulée Automatisme', __FILE__)); $cmd->setTemplate('dashboard', 'tile'); } $cmd->setEqLogic_id($this->getId()); $cmd->setType('info'); $cmd->setSubType('numeric'); $cmd->setUnite('W'); $cmd->setIsHistorized(1); $cmd->setIsVisible(0); $cmd->save(); $cmd = $this->getCmd(null, 'powerCumulElectrical'); if (!is_object($cmd)) { $cmd = new energyCmd(); $cmd->setLogicalId('powerCumulElectrical'); $cmd->setName(__('Puissance Cumulée Electroménager', __FILE__)); $cmd->setTemplate('dashboard', 'tile'); } $cmd->setEqLogic_id($this->getId()); $cmd->setType('info'); $cmd->setSubType('numeric'); $cmd->setUnite('W'); $cmd->setIsHistorized(1); $cmd->setIsVisible(0); $cmd->save(); $cmd = $this->getCmd(null, 'consumptionLight'); if (!is_object($cmd)) { $cmd = new energyCmd(); $cmd->setLogicalId('consumptionLight'); $cmd->setTemplate('dashboard', 'tile'); $cmd->setConfiguration('historizeMode', 'max'); $cmd->setIsHistorized(1); } $cmd->setName(__('Consommation Lumière', __FILE__)); $cmd->setEqLogic_id($this->getId()); $cmd->setType('info'); $cmd->setSubType('numeric'); $cmd->setUnite($unite); $cmd->setIsVisible($this->getConfiguration('visibleConsumptionLight', 0)); $cmd->save(); $cmd = $this->getCmd(null, 'consumptionOther'); if (!is_object($cmd)) { $cmd = new energyCmd(); $cmd->setLogicalId('consumptionOther'); $cmd->setTemplate('dashboard', 'tile'); $cmd->setConfiguration('historizeMode', 'max'); $cmd->setIsHistorized(1); } $cmd->setName(__('Consommation Autre', __FILE__)); $cmd->setEqLogic_id($this->getId()); $cmd->setType('info'); $cmd->setSubType('numeric'); $cmd->setUnite($unite); $cmd->setIsVisible($this->getConfiguration('visibleConsumptionOther', 0)); $cmd->save(); $cmd = $this->getCmd(null, 'consumptionMultimedia'); if (!is_object($cmd)) { $cmd = new energyCmd(); $cmd->setLogicalId('consumptionMultimedia'); $cmd->setTemplate('dashboard', 'tile'); $cmd->setConfiguration('historizeMode', 'max'); $cmd->setIsHistorized(1); } $cmd->setName(__('Consommation Multimedia', __FILE__)); $cmd->setEqLogic_id($this->getId()); $cmd->setType('info'); $cmd->setSubType('numeric'); $cmd->setUnite($unite); $cmd->setIsVisible($this->getConfiguration('visibleConsumptionMultimedia', 0)); $cmd->save(); $cmd = $this->getCmd(null, 'consumptionAutomatism'); if (!is_object($cmd)) { $cmd = new energyCmd(); $cmd->setLogicalId('consumptionAutomatism'); $cmd->setTemplate('dashboard', 'tile'); $cmd->setConfiguration('historizeMode', 'max'); $cmd->setIsHistorized(1); } $cmd->setName(__('Consommation Automatisme', __FILE__)); $cmd->setEqLogic_id($this->getId()); $cmd->setType('info'); $cmd->setSubType('numeric'); $cmd->setUnite($unite); $cmd->setIsVisible($this->getConfiguration('visibleConsumptionAutomatism', 0)); $cmd->save(); $cmd = $this->getCmd(null, 'consumptionElectrical'); if (!is_object($cmd)) { $cmd = new energyCmd(); $cmd->setLogicalId('consumptionElectrical'); $cmd->setTemplate('dashboard', 'tile'); $cmd->setConfiguration('historizeMode', 'max'); $cmd->setIsHistorized(1); } $cmd->setName(__('Consommation Electromenager', __FILE__)); $cmd->setEqLogic_id($this->getId()); $cmd->setType('info'); $cmd->setSubType('numeric'); $cmd->setUnite($unite); $cmd->setIsVisible($this->getConfiguration('visibleConsumptionElectrical', 0)); $cmd->save(); $cmd = $this->getCmd(null, 'consumptionHeating'); if (!is_object($cmd)) { $cmd = new energyCmd(); $cmd->setLogicalId('consumptionHeating'); $cmd->setTemplate('dashboard', 'tile'); $cmd->setConfiguration('historizeMode', 'max'); $cmd->setIsHistorized(1); } $cmd->setName(__('Consommation Chauffage', __FILE__)); $cmd->setEqLogic_id($this->getId()); $cmd->setType('info'); $cmd->setSubType('numeric'); $cmd->setUnite($unite); $cmd->setIsVisible($this->getConfiguration('visibleConsumptionHeating', 0)); $cmd->save(); $cmd = $this->getCmd(null, 'consumptionHp'); if (!is_object($cmd)) { $cmd = new energyCmd(); $cmd->setLogicalId('consumptionHP'); $cmd->setTemplate('dashboard', 'tile'); $cmd->setConfiguration('historizeMode', 'max'); $cmd->setIsHistorized(1); } $cmd->setName(__('Consommation HP', __FILE__)); $cmd->setEqLogic_id($this->getId()); $cmd->setType('info'); $cmd->setSubType('numeric'); $cmd->setUnite($unite); $cmd->setIsVisible($this->getConfiguration('visibleConsumptionHP', 0)); $cmd->save(); $cmd = $this->getCmd(null, 'consumptionHc'); if (!is_object($cmd)) { $cmd = new energyCmd(); $cmd->setLogicalId('consumptionHC'); $cmd->setTemplate('dashboard', 'tile'); $cmd->setConfiguration('historizeMode', 'max'); $cmd->setIsHistorized(1); } $cmd->setName(__('Consommation HC', __FILE__)); $cmd->setEqLogic_id($this->getId()); $cmd->setType('info'); $cmd->setSubType('numeric'); $cmd->setUnite($unite); $cmd->setIsVisible($this->getConfiguration('visibleConsumptionHC', 0)); $cmd->save(); $refresh = $this->getCmd(null, 'debug'); if (!is_object($refresh)) { $refresh = new energyCmd(); $refresh->setName(__('debug', __FILE__)); } $refresh->setEqLogic_id($this->getId()); $refresh->setLogicalId('debug'); $refresh->setType('action'); $refresh->setSubType('other'); $refresh->setIsVisible(0); $refresh->save(); } else { $this->setConfiguration('totalCounter', 1); } } /* * **********************Getteur Setteur*************************** */ } class energyCmd extends cmd { /* * *************************Attributs****************************** */ /* * ***********************Méthodes statiques*************************** */ /* * *********************Méthodes d'instance************************* */ public function formatValueWidget($_value) { if ($this->getType() == 'info' && $this->getSubType() == 'numeric') { return round($_value, 2); } return $_value; } public function getHistoryEnergy($_startTime = null, $_endTime = null) { $values = array( 'cmd_id' => $this->getId(), ); if ($_startTime != null) { $values['startTime'] = date('Y-m-d H:i:s', strtotime('+1 hours ' . $_startTime)); } if ($_endTime != null) { $values['endTime'] = date('Y-m-d H:i:s', strtotime('+1 day ' . $_endTime)); } $sql = ' SELECT date(`datetime`) as "0", MAX(CAST(value as DOUBLE)) as "1" FROM ( SELECT (`datetime` - INTERVAL 240 SECOND) as `datetime`,value FROM history WHERE cmd_id=:cmd_id '; if ($_startTime != null) { $sql .= ' AND `datetime`>=:startTime'; } if ($_endTime != null) { $sql .= ' AND `datetime`<=:endTime'; } $sql .= ' UNION ALL SELECT (`datetime` - INTERVAL 240 SECOND) as `datetime`,value FROM historyArch WHERE cmd_id=:cmd_id'; if ($_startTime != null) { $sql .= ' AND `datetime`>=:startTime'; } if ($_endTime != null) { $sql .= ' AND `datetime`<=:endTime'; } $sql .= ' ) as dt GROUP BY date(`datetime`) ORDER BY `datetime` ASC;'; try{ return DB::Prepare($sql, $values, DB::FETCH_TYPE_ALL); }catch(Exception $e) { $sql = 'SET sql_mode=(SELECT REPLACE(@@sql_mode, "ONLY_FULL_GROUP_BY", ""));' . $sql . 'SET sql_mode=(SELECT CONCAT(@@sql_mode,",ONLY_FULL_GROUP_BY"))'; return DB::Prepare($sql, $values, DB::FETCH_TYPE_ALL); } } public function dontRemoveCmd() { return true; } public function execute($_options = array()) { $eqlogic = $this->getEqLogic(); if(is_null($eqlogic)){ log::add('energy', 'debug', 'is null'); } if(is_object($eqlogic) == false){ log::add('energy', 'debug', 'is not obj'); } switch ($this->getLogicalId()) { case 'debug': // LogicalId de la commande rafraîchir que l’on a créé dans la méthode Postsave de la classe vdm . // code pour rafraîchir ma commande //energy::cron15('Y-m-20 H:i:00'); break; } } /* * **********************Getteur Setteur*************************** */ } ?>