Bonjour je voudrais savoir s’il y a une fonction simple qui permettrait de savoir combien de temps une commande a passer dans un certain statut entre deux date données
Par ex: Combien de temps a passer le thermostat salon en statut « chauffage » entre il y a 3 jours et maintenant ?
C’est possible avec des timestamps et des valeur tampon, mais je me disais qu’il y avait surement plus simple. Merci d’avance
Bonjour
Voir doc https://doc.jeedom.com/fr_FR/core/4.3/scenario tout est listé
Cherchez durationbetween
Bonsoir,
En faite la proposition de @Mips me semblait aussi la meilleur, mais il semble qu’actuellement, ou peut-être depuis longtemps, les fonctions duration et durationbetween ne fonctionnent pas avec des infos de type string, mais que avec des infos de type numérique…
Peut être avec ceci
Bonjour, le code proposé dans le post ne permet pas de retourner une durée.
Dans la même idée, a placer dans user.function.class.php :
my_duration(commande, valeur, période)
- Donnent la durée en minutes pendant laquelle l’équipement avait la valeur choisie sur la période (period=[month,day,hour,min] ou expression PHP)
public static function my_duration($_cmd_id, $_value, $_period = '1 hour', $_unit = 60, $_operator = '==') {
$cmd_id = str_replace('#', '', $_cmd_id);
if (!is_numeric($cmd_id)) $cmd = cmd::byId(str_replace('#', '', cmd::humanReadableToCmd($_cmd_id)));
else $cmd = cmd::byId($cmd_id);
if (!is_object($cmd) || $cmd->getIsHistorized() == 0) return '';
if (!is_numeric($_value)) {
$_operator = '=='; // forcing operator if string.
$_value = strtolower($_value);
}
$cmd_id = $cmd->getId();
$dates = scenarioExpression::getDatesFromPeriod($_period); // $dates = self::getDatesFromPeriod($_period);
$_startTime = $dates[0];
$_endTime = $dates[1];
$_value = str_replace(',', '.', $_value);
$_decimal = strlen(substr(strrchr($_value, "."), 1));
$histories = $cmd->getHistory($_startTime, $_endTime);
$duration = 0;
$lastDatetime = strtotime($_startTime);
$historyAtDateTime = history::byCmdIdAtDatetime($cmd_id, $_startTime);
if (!is_object($historyAtDateTime)) { // No data present before the requested date
if (count($histories) == 0) { // No data present in the requested period
return 0;
}
if (is_numeric($_value)) $lastValue = round($histories[0]->getValue(), $_decimal);
else $lastValue = strtolower($histories[0]->getValue());
if (strtotime($_startTime) < strtotime($histories[0]->getDatetime())) {
$lastDatetime = strtotime($histories[0]->getDatetime());
}
} else {
if (is_numeric($_value)) $lastValue = round($historyAtDateTime->getValue(), $_decimal);
else $lastValue = strtolower($historyAtDateTime->getValue());
}
foreach ($histories as $history) {
if ($history->getDatetime() < $_startTime) {
if (is_numeric($_value)) $lastValue = round($history->getValue(), $_decimal);
else $lastValue = strtolower($history->getValue());
continue;
}
if ($history->getDatetime() <= $_endTime) {
if (evaluate('"' . $lastValue . '"' . $_operator . '"' . $_value . '"')){
$duration += strtotime($history->getDatetime()) - $lastDatetime;
}
} else {
if (evaluate('"' . $lastValue . '"' . $_operator . '"' . $_value . '"')){
$duration += strtotime($_endTime) - $lastDatetime;
}
break;
}
$lastDatetime = strtotime($history->getDatetime());
if (is_numeric($_value)) $lastValue = round($history->getValue(), $_decimal);
else $lastValue = strtolower($history->getValue());
}
$endTime = strtotime($_endTime);
if (evaluate('"' . $lastValue . '"' . $_operator . '"' . $_value . '"') && $lastDatetime <= $endTime){
$duration += ($endTime - $lastDatetime);
}
return round($duration / $_unit, $_decimal);
}
Puis pour appeler la fonction dans un virtuel par exemple :
my_duration(#[Rdc][Thermostat Rdc][Statut]#,chauffage,3 hours)
my_durationBetween(commande,valeur,start,end)
- Donnent la durée en minutes pendant laquelle l’équipement avait la valeur choisie entre les 2 bornes demandées (sous la forme
Y-m-d H:i:sou expression PHP).
public static function my_durationBetween($_cmd_id, $_value, $_startDate, $_endDate, $_unit = 60, $_operator = '==') {
if (!is_numeric(str_replace('#', '', $_cmd_id))) $cmd = cmd::byId(str_replace('#', '', cmd::humanReadableToCmd($_cmd_id)));
else $cmd = cmd::byId(str_replace('#', '', $_cmd_id));
if (!is_object($cmd) || $cmd->getIsHistorized() == 0) return '';
if (strtotime($_startDate) >= time()) return 0;
if (time() < strtotime($_endDate)) $_endDate = date('Y-m-d H:i:s');
$_startTime = date('Y-m-d H:i:s', strtotime(scenarioExpression::setTags($_startDate))); // self::setTags($_startDate)
$_endTime = date('Y-m-d H:i:s', strtotime(scenarioExpression::setTags($_endDate))); // self::setTags($_endDate)
$_value = str_replace(',', '.', $_value);
$_decimal = strlen(substr(strrchr($_value, "."), 1));
if (!is_numeric($_value)) {
$_operator = '=='; // forcing operator if string.
$_value = strtolower($_value);
}
$histories = $cmd->getHistory();
if (count($histories) == 0) return 0;
$duration = 0;
$lastDuration = strtotime($histories[0]->getDatetime());
if (is_numeric($_value)) $lastValue = round($histories[0]->getValue(), $_decimal);
else $lastValue = strtolower($histories[0]->getValue());
foreach ($histories as $history) {
if ($history->getDatetime() >= $_startTime) {
if ($history->getDatetime() <= $_endTime) {
if (evaluate('"' . $lastValue . '"' . $_operator . '"' . $_value . '"')){ // if ($lastValue == $_value) {
$duration = $duration + (strtotime($history->getDatetime()) - $lastDuration);
}
} else {
if (evaluate('"' . $lastValue . '"' . $_operator . '"' . $_value . '"')){ // if ($lastValue == $_value) {
$duration = $duration + (strtotime($_endTime) - $lastDuration);
}
$lastDuration = strtotime($history->getDatetime());
if (is_numeric($_value)) $lastValue = round($history->getValue(), $_decimal);
else $lastValue = strtolower($history->getValue());
break;
}
$lastDuration = strtotime($history->getDatetime());
} else {
$lastDuration = strtotime($_startTime);
}
if (is_numeric($_value)) $lastValue = round($history->getValue(), $_decimal);
else $lastValue = strtolower($history->getValue());
}
if (evaluate('"' . $lastValue . '"' . $_operator . '"' . $_value . '"') && $lastDuration <= strtotime($_endTime)) {
$duration = $duration + (strtotime($_endTime) - $lastDuration);
}
return floor($duration / $_unit);
}
Puis pour appeler la fonction dans un virtuel par exemple :
my_durationBetween(#[Rdc][Thermostat Rdc][Statut]#,Chauffage,2023-04-08 07:00:00,2023-04-09 07:00:00)
