Cherche date plus ancienne valeur d'un virtuel

Bonjour
je sais trouver facilement la date la plus récente d’une valeur d’un virtuel,
Mais je cherche à déterminer la date de la plus ancienne valeur d’un virtuel…
Et je ne trouve pas, malgré de nombreuses recherches
Auriez vous une idée ?
Par avance merci
Lemars

Cela devrait le faire.

$cmdId = cmd::byString("#[ma][commande][info]#")->getId();
$all = history::all($cmdId);
$premiereValeur = count($all) ? $all[0]->getValue() : null;
$datetime = count($all) ? $all[0]->getDatetime() : null;
$scenario->setLog('Première Valeur : ' . $premiereValeur);
$scenario->setLog('Datetime : ' . $datetime);
1 « J'aime »

merci beaucoup,
Et en fait je cherche une commande a intégrer dans mon virtuel (pas en code) pour faire un calcul
et ma première valeur n’est pas obligatoirement nulle pour info
merci à vous

Il ne me semble pas avoir vu une fonction toute faite pour arriver à tes fins.
Je ne vois donc pas d’autre solution que de créer ta propre fonction pour pouvoir l’intégrer dans ton virtuel.

1 « J'aime »

Non, c’est un test au cas ou il n’y aurait pas de valeur dans l’historique.

merci mais je pense avoir trouvé : je fais la différence entre l’heure actuelle et l’heure a laquelle le virtuel a été au min
« 734 » étant l’ID de l’info qui est #[VEHICULES][Suivi CPT km vehicules][compteur vélo]#

date(« Y-m-d H:i:s »,strtotime(‹ now ›)-lastChangeStateDuration(734,statisticsBetween(#[VEHICULES][Suivi CPT km vehicules][compteur vélo]#,min,now)))

Cette formule ne marche malheureusement pas pour la date la plus ancienne de mon historique, mais que pour la dernière (la maxi en l’occurence) :
date(« Y-m-d H:i:s »,strtotime(‹ now ›)-lastChangeStateDuration(734,statisticsBetween(#[VEHICULES][Suivi CPT km vehicules][compteur vélo]#,max,now)))

Je ne comprends pas pourquoi…
C’est un historique que j’ai reconstitué en injectant les valeurs par un script
$cmd = cmd::byId(753);
$cmd->addHistoryValue(22900, ‹ 2015-09-04 10:10:10 ›);

Surprenant encore :
valeur la plus ancienne : 457 km le 15/05/2007 —> si je fais :
date(« Y-m-d H:i:s »,strtotime(‹ now ›)-lastChangeStateDuration(734,457)) —> il ne trouve rien

mais si je prends la valeur juste apres : 465 km le 1/06/2007 —> si je fais :
date(« Y-m-d H:i:s »,strtotime(‹ now ›)-lastChangeStateDuration(734,464)) —> il trouve bien la bonne date !
DINGUE!!!

Et le code que je t’ai proposé, donne-t-il les bonnes valeurs ?

J’ai donc lancé le code

$cmdId = cmd::byString("#[VEHICULES][Suivi CPT km vehicules][compteur vélo]#")->getId();
$all = history::all($cmdId);
$premiereValeur = count($all) ? $all[0]->getValue() : null;
$datetime = count($all) ? $all[0]->getDatetime() : null;
$scenario->setLog('Première Valeur : ’ . $premiereValeur);
$scenario->setLog('Datetime : ’ . $datetime);

Mais je ne sais pas ou aller voir le résultat ? faut activer les logs de scenarios ?
Dans le scenario lui meme j’ai mis : Log temps réel

mais rien n’apparait dans les logs
Faut il aller dans temps Reel ? Je ne connais pas bien ces menus

désolé de mon inexpérience

Après avoir exécuté le scénario, tu cliques juste à côté de Ajouter bloc.

Capture d’écran du 2020-09-16 22-01-24

merci !
Il me donne bien 457 au 15/05/2007 : qui est la première valeur la plus vieille

Donc je ne comprends pas pourquoi ma fonction ne marche pas
car j’avoue que je souhaite rester sur un virtuel sans scenario

alors ou est ce que mon historique pose probleme ? je cherche

valeur la plus ancienne : 457 km le 15/05/2007 —> si je fais :
date(« Y-m-d H:i:s »,strtotime(‹ now ›)-lastChangeStateDuration(734,457)) —> il ne trouve rien
ET ME RENVOIE -1
D’après la doc c’est -1 : Aucun historique n’existe ou la valeur n’existe pas dans l’historique

mais si je prends la valeur juste apres : 465 km le 1/06/2007 —> si je fais :
date(« Y-m-d H:i:s »,strtotime(‹ now ›)-lastChangeStateDuration(734,464)) —> il trouve bien la bonne date !

Tu peux créer ta propre fonction dans le fichier user.function.class.php en utilisant et adaptant le code que je t’ai proposé.

Ca commence a etre délicat pour moi !
Vous l’utilisez souvent ?

Je te laisse découvrir avec des sujets sur le forum.

https://community.jeedom.com/search?expanded=true&q=userFunction%20order:latest

https://community.jeedom.com/search?q=user.function.class%20order:latest

Si tu as des difficultés pour la mise en œuvre, revient vers nous.

Ajout des fonctions dans /var/www/html/data/php/user.function.class.php

/* * ***************************Includes********************************* */
require_once dirname(__FILE__) . '/../../core/php/core.inc.php';

class userFunction {

	public static function firstValueHistory($_cmd = '') {
		$cmdId = cmd::byString($_cmd)->getId();
		$all = history::all($cmdId);
		$firstValue = count($all) ? $all[0]->getValue() : null;
		return $firstValue;
	}
	
	public static function firstValueHistoryDate($_cmd = '') {
		$cmdId = cmd::byString($_cmd)->getId();
		$all = history::all($cmdId);
		$firstValueDate = count($all) ? $all[0]->getDatetime() : null;
		return $firstValueDate;
	}

}

Appel de la fonction dans ta commande

firstValueHistory(#[ma][commande][info]#)

ou

firstValueHistoryDate(#[ma][commande][info]#)

Amélioration du code :

Merci merci beaucoup, je vais m’y exercer ensuite des que j’ai du temps calme

Sinon y a t il un moyen de trouver la date d’une valeur juste après une autre valeur :
exemple :
457 km le 15/05/2007 - c’est la 1er valeur la plus ancienne de mon historique
465 km le 1/06/2007 - c’est la valeur juste après
Comment puis indiquer dans la fonction lastChangeStateDuration(734,457)
d’aller cherche à partir de 457km : comme dans un range : entre 457 et 457x2 par exemple ?

Cela revient a chercher la date de valeur suivante d’une valeur…

Ou alors simplement trouver la valeur suivante (465km) a une valeur donnée (457km) ?
et après j’en calcule la date…