Bug ou Changement de comportement de la commande duration?

Bonjour ,

En 4.1 jusqu’ici pour connaitre le temps de fonctionnement d’un appareil dans la journée de minuit à maintenant en minute j’utilisais :

duration(#info#,1,today)

mais je viens de passer en 4.2 (oui j’ai un train de retard ^^) et je constate que les valeurs renvoyées sont fausse , en fait je ne saurais le garantir mais j’ai l’impression que cette formule me renvois la valeur des 24h dernière heures à la place .

je vais donc être obligé de remplacer cette commande par des

durationBetween(#info#, 1 , Today,Now ) qui me renvois elle la bonne valeurs

Est-ce un comportement normal de la 4.2 ? ou est-ce que c’était m’a 4.1 qui déconnait ? parceque je le jure j’ai vérifié et re-verifié et jusqu’ici duration(#info#,1,today) me renvoyait bien les bons résultats . :laughing:

Salut,

Pas de souci rencontré que ce soit avec duration

Ou durationbetween

ok donc il y à une probleme avec mon jeedom

Duration:
duration
Duration Between:
duration between 1

je fait toutes les verif et nettoyage dispo dans os/odb , aucun changement .

je précise que je suis passé à la 4.2 cette semaine .

Bonjour,

On peut savoir comment? car depuis cette semaine c’est une 4.3 qui est en stable.

Pouvez-vous montrer la page santé?

ben juste avant que la 4.3 soit dispo , peut être dimanche en fait .

EDIT:

et la page santé :

le nok pour le réseau je l’ai depuis toujours , ça viens de ma config réseau , mais tout fonctionne correctement de ce coté .

1 « J'aime »

Salut,

Si tu as un problème avec Jeedom alors moi aussi :stuck_out_tongue:

image

Sachant que l’historique est simple … des petits coups de 1 durant peu de temps et qu’il est donc impossible que mon portail soit resté ouvert 471 minutes.

Version : 4.1.20

@bison et @krom77,

Et sans espaces après les virgules de la formule c’est mieux ?

1 « J'aime »

Pas chez moi non

image

contant d’apprendre que je ne suis pas le seul ^^ et j’ai aussi testé avec et sans les espaces , et avec et sans majuscule à today dans le doute .

et si vous mettez today midnight ça change quelque chose ?

non, même résultat qu’avec today

EDIT: je viderais bien toutes les données en cache mais je ne l’ai jamais fait et j’ai un peut peur de perdre des données que je considère importante . Qu’est-ce que je risque vraiment ?

ça m’étonnerai…
Bug remonté au moins depuis avril 2021 ici

Je l’ai encore personnellement rappelé (via le support) il y a peu.
Réponse : « De mémoire on a deja vu ca et c’est corrigé en beta depuis quelques mois. »

lol merci de cette intervention mais sans vouloir casser tes délires, ces 2 fonctions ont plusieurs fois évolué depuis avril 2021 notamment et plus particulièrement en avril 2022 pour duration et en aout 2022 pour durationBetween.

Donc le coup de « c’est pareil depuis 2021 » parait simplement impossible…

Edit : D’ailleurs, je ne l’invente pas, le titre du présent sujet parle bien de changement de comportement !

1 « J'aime »

Quand je parle de changement de comportement je veux dire que je me demandais si c’était un changement comportement voulu .

Mais bref , en tout cas duration bug clairement chez moi , et pas tout le temps dans le même sens , j’ai testé sur une autre commande et au lieu de me donner une réponse erronée supérieure elle à mis une réponse inférieure , égale à zéro en fait si ça peut peut être servir aux dev .

@Salvialf,

J’ai regardé les 2 fonctions et tenté de comprendre pourquoi ces 2 fonctions ne sont pas « identiques » et je ne comprends pas la raison.

Puisque dans la duration les seules choses qui me semble changer sont :

  • _endTime , que l’on ne précise pas et qui est now
  • des subtilités sur le _startTime qui sont gérés par getDatesFromPeriod

Du coup en recréant une fonction « custom » basée sur le début de la duration et le calcul de la durationBetween je retrouve les mêmes (bons) résultats.

  	public static function durationBison($_cmd_id, $_value, $_period = '1 hour', $_unit = 60) {
		$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 '';
		}
		$dates = self::getDatesFromPeriod($_period);
		$_startTime = $dates[0];
		$_endTime = $dates[1];

		$_value = str_replace(',', '.', $_value);
		$_decimal = strlen(substr(strrchr($_value, "."), 1));

		$histories = $cmd->getHistory();

		$duration = 0;
		$lastDuration = strtotime($histories[0]->getDatetime());
		$lastValue = $histories[0]->getValue();

		foreach ($histories as $history) {
			if ($history->getDatetime() >= $_startTime) {
				if ($history->getDatetime() <= $_endTime) {
					if ($lastValue == $_value) {
						$duration = $duration + (strtotime($history->getDatetime()) - $lastDuration);
					}
				} else {
					if ($lastValue == $_value) {
						$duration = $duration + (strtotime($_endTime) - $lastDuration);
					}
					$lastDuration = strtotime($history->getDatetime());
					$lastValue = round($history->getValue(), $_decimal);
					break;
				}
				$lastDuration = strtotime($history->getDatetime());
			} else {
				$lastDuration = strtotime($_startTime);
			}
			$lastValue = round($history->getValue(), $_decimal);
		}
		if ($lastValue == $_value && $lastDuration <= strtotime($_endTime)) {
			$duration = $duration + (strtotime($_endTime) - $lastDuration);
		}
		return floor($duration / $_unit);
	}

Surement quelque chose qui m’échappe parce que j’ai pas regardé ça très longtemps et que je n’ai pas un gros niveau mais … sais-tu pourquoi une telle différences dans le traitement de l’addition de la variable $duration ?

image

De 00H00 à 00H58 ==58
image
DE 15H42 à 17H33 = 111
image image

image

image

ben oui tu n’a clairement pas le bug :laughing: tu est sur quelle version stp ? parceque on est au moins deux à l’avoir en 4.1 et 4.2

OK mais en l’occurrence on est en 4.3 donc oui il peut potentiellement y avoir des erreurs sur les versions antérieures corrigée sur la dernière version.

1 « J'aime »

Oui je me doute que vous n’allez pas micro-patcher la 4.2 alors que la 4.3 est sortie , mais entre ça et les bugs que je viens d’avoir aujourd’hui avec jmqtt qui ne recevait plus rien de mes appareils (qui gérent mon chauffage … ) que j’ai du ré-intégrer à la mains cette après midi , je suis pas hyper chaud pour passer en 4.3 là de suite … :sweat_smile:

tampi hein je vais passer tout les duration en durationbetween , mais si une bonne âme passe dans le coin et à le code qui le démange je pense que ça vaut le coup de rappeler que je suis pas le seul :wink: .

Si tu veux patcher toi même ton jeedom il suffit de remplacer le code de la fonction par celui de la 4.3 sur ton install

1 « J'aime »