Jeedom 4.4 lastChangeStateDuration : régression?

Salut

Je viens de découvrir un pb sur ma prod avec la fonction lastChangeStateDuration.
Mon scenario fonctionnait parfaitement auparavant.

Mon code:

$scenario->setLog("cmd id: ". $cmd->getId());
$t = history::lastChangeStateDuration($cmd->getId(),1); 
$scenario->setLog("durée en s: ". $t);

la log:

[2026-01-27 19:30:33][SCENARIO] cmd id: 5278
[2026-01-27 19:30:33][SCENARIO] durée en s: -1

Contenu de la table history:

MariaDB [jeedom]> select * from history where cmd_id = 5278;
+--------+---------------------+-------+
| cmd_id | datetime            | value |
+--------+---------------------+-------+
|   5278 | 2026-01-27 08:01:47 | 1     |
|   5278 | 2026-01-27 08:12:02 | 0     |
|   5278 | 2026-01-27 11:36:40 | 0     |
+--------+---------------------+-------+
3 rows in set (0,001 sec)

Par contre si je demande lastChangeStateDuration($cmd->getId(),0) ca fonctionne!

[2026-01-27 20:15:41][SCENARIO] cmd id: 5278
[2026-01-27 20:15:41][SCENARIO] durée en s: 43419

Y aurait-il eu des changements récents dans le code de la v4.4?
Je suis en v4.4.20.

Merci pour vos lumières

Récent comment ? À part la 4.5.x?

Bonne question. Ça marchait il y a quelques mois mais je ne saurais pas dire combien

Pas très utile, le code de jeedom v4.4.x ne va plus évoluer. Voir les échanges qui ont suivi le bug du 1er janvier. Les PR sont visibles au besoin sur le github.

Il faudrait surtout voir si elle existe en v4.5.2 en fait.

Antoine
PS: la fonction est utilisée pour une commande historisée ?

Bonjour,
D’après la définition de la commande :

  • lastChangeStateDuration(commande,valeur).
    Retourne la durée en secondes depuis le dernier changement d’état à la valeur passée en paramètre. Cependant, -1 = aucun historique n’existe ou la valeur n’existe pas dans l’historique et -2 = la commande n’est pas historisée.

De ma compréhension, la valeur 1 est l’état initial.
Donc, il n’y a pas encore eu de changement de cette valeur dans l’historique. D’où le -1 en retour.
Ce qui est plus dur à expliquer, c’est pourquoi il y a 2 valeurs à 0 sans passer par 1.
Sans doute une sauvegarde de l’objet comprenant la commande sans changement de l’état et donc un nouvel enregistrement dans l’historique puisque 20:15:41 - 43419s = 08:12:02.

Quel est le résultat de la commande après plusieurs changements d’état ?

Salut,

Ca va être compliqué de déterminer cela sachant qu’une majorité des utilisateurs est maintenant sur la 4.5

Cela dit vu que les sources sont sur github tu peux voir l’ensemble des commits faits sur cette classe : History for core/class/history.class.php - jeedom/core · GitHub

merci pour vos réponses.
je vais tester sur la v4.5.2 mais je vois pas pourquoi ca serait différent…

@aurel, @rootard :
Hello,
Je ne suis pas expert en php mais j’aime bien les challenges.
D’après ce que je vois sur le depot pour cette fonction, il ne faut pas que la valeur cherchée soit uniquement la plus ancienne de l’historique.
Pour sortir une valeur il faut que $nextValue (qui est la valeur plus ancienne que celle en cours vu qu’on est en array_reverse) soit différente de la cible $_value.
C’est pour ca que ca ne marche pas.
Donc @rootard pas besoin de tester en 4.5.2.

@Fifirept avait raison.

A mon avis, il y a des gens qui vont dire que c’est normal, la fonction fait ce qu’elle dit puisque ce n’est pas passé d’une valeur lambda à 1 dans l’historique.
Mais en même temps, ca ne doit pas être compatible avec la fonction qui supprime des données historique après X jours ou je dis une bétise? (là c’est une supposition je ne sais pas s’il y a une sauvegarde de la valeur précédente au moment de la suppression)
Ca me semblerait plus logique de demander un correctif de la fonction.

Merci pour vos remarques
Effectivement la succession de 2 valeurs a zero est étrange.
Il s’agit de la présence d’une device BT donc ca va m’être compliqué de reproduire le même test en v4.5.2 ceci dit je viens de le faire un autre device et j’ai volontairement modifié la dernière valeur dans la DB pour que ca soit 0 pas 1:

MariaDB [jeedom]> select * from history where cmd_id = 37788;
+--------+---------------------+-------+
| cmd_id | datetime            | value |
+--------+---------------------+-------+
|  37788 | 2026-01-29 19:14:18 | 1     |
|  37788 | 2026-01-29 19:16:02 | 0     |
|  37788 | 2026-01-29 19:17:52 | 0     |
+--------+---------------------+-------+
3 rows in set (0,001 sec)

Je ne me l’explique pas mais ici ca fonctionne en v4.5.2 !


[2026-01-29 19:20:58][SCENARIO] Exécution d'un bloc code 
[2026-01-29 19:20:58][SCENARIO] cmd id: 37788 
[2026-01-29 19:20:58][SCENARIO] durée en s: 400 
[2026-01-29 19:20:58][SCENARIO] Fin correcte du scénario

Je pense que je vais en rester la je retesterai quand je passerai ma prod en v4.5

@rootard : Hello, tu dois avoir une valeur différente de 1 dans historyArch pour la même commande ?

Salut
C’est une commande binaire
Je vois pas ce que ça change vu l’ordre des valeurs

Hello,
C’est juste que la fonction prend en compte la table historyArch en plus de la table history.
Si dans l’ensemble des 2 tables il n’y a pas de valeur 0 avant ta valeur 1 (datetime inférieur), alors la fonction renverra -1. Même dans la version Jeedom 4.5.2.

Tu dois pouvoir le vérifier facilement avec la commande SQL :
SELECT * FROM history WHERE cmd_id = 37788 union all SELECT * FROM historyArch WHERE cmd_id = 37888 order by datetime desc limit 10

Oui j’ai bien compris donc UNION ou pas ça ne devrait rien y changer la valeur 1 est déjà dans la table history

Ce que je voulais dire c’est que non, la présence du 1 ne suffit pas même si c’est binaire, il faut qu’il y ait un 0 antérieur au 1 pour que la fonction prenne en compte la ligne avec la valeur 1 et calcule la durée. (donc avant 19h14, là tes 0 sont après)
Tu n’as qu’à supprimer le historyArch pr la commande 37788 et tu verras le résultat de la fonction par toi-même (normalement -1).

Mais donc la fonction n’a pas changé depuis Jeedom 4.4 puisque c’était la question.

Bonne soirée !

Salut

Désolé de te contredire mais ici la table historyArch est vide et ca ne change rien au résultat:

MariaDB [jeedom]> SELECT * FROM history WHERE cmd_id = 37788 union all SELECT * FROM historyArch WHERE cmd_id = 37888 limit 10 ;
+--------+---------------------+-------+
| cmd_id | datetime            | value |
+--------+---------------------+-------+
|  37788 | 2026-01-29 19:14:18 | 1     |
|  37788 | 2026-01-29 19:16:02 | 0     |
|  37788 | 2026-01-29 19:17:52 | 0     |
|  37788 | 2026-01-29 19:44:44 | 0     |
+--------+---------------------+-------+
4 rows in set (0,001 sec)
MariaDB [jeedom]>  SELECT * FROM history WHERE cmd_id = 37788 ;
+--------+---------------------+-------+
| cmd_id | datetime            | value |
+--------+---------------------+-------+
|  37788 | 2026-01-29 19:14:18 | 1     |
|  37788 | 2026-01-29 19:16:02 | 0     |
|  37788 | 2026-01-29 19:17:52 | 0     |
|  37788 | 2026-01-29 19:44:44 | 0     |
+--------+---------------------+-------+
4 rows in set (0,000 sec)
[2026-01-30 21:01:01][SCENARIO] - Exécution du sous-élément de type [action] : code [2026-01-30 21:01:01][SCENARIO] Exécution d'un bloc code 
[2026-01-30 21:01:01][SCENARIO] cmd id: 37788 
[2026-01-30 21:01:01][SCENARIO] durée en s: 92803

Donc à priori peu importe la valeur d’avant celle qui est recherchée…
Je ne m’explique pas le comportement en v4.4 mais c’est pas très grave

Bonne soirée aussi

1 « J'aime »

Hello,

37788 pour history et 37888 pour historyArch :wink:

1 « J'aime »

ha bien vu!
alors effectivement historyArch n’était pas vide:

MariaDB [jeedom]> SELECT * FROM historyArch WHERE cmd_id = 37788 ;
+--------+---------------------+-------+
| cmd_id | datetime            | value |
+--------+---------------------+-------+
|  37788 | 2026-01-28 19:48:23 | 0     |
|  37788 | 2026-01-28 19:50:36 | 1     |
|  37788 | 2026-01-28 19:57:14 | 0     |
|  37788 | 2026-01-28 19:59:54 | 1     |
|  37788 | 2026-01-28 20:02:45 | 0     |
+--------+---------------------+-------+

Par contre si je la vide j’obtiens -1:

MariaDB [jeedom]> delete from historyArch WHERE cmd_id = 37788 ;
Query OK, 5 rows affected (0,001 sec)
[2026-01-31 14:01:59][SCENARIO] Exécution d'un bloc code
[2026-01-31 14:01:59][SCENARIO] cmd id: 37788
[2026-01-31 14:01:59][SCENARIO] durée en s: -1

Sujet clos merci pour votre aide

1 « J'aime »

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.