Avant toute chose merci de (re)prendre connaissance de la charte et de la respecter.
Pour résumer :
- Avant de poser une question, je cherche si la réponse existe
- Je suis poli, courtois et je respecte tout un chacun sur le forum
- Si un post m'agace : je m'en éloigne plutôt que de répondre d'une façon qui pourrait être mal interprétée


Il n'est jamais du luxe que de rappeler des choses simples :
Courtoisie, amabilité, politesse et bonne humeur sont les maîtres mots pour un forum sympathique, bienveillant et accueillant :)

Toute la communauté vous remercie

StateDuration semble ne plus fonctionner

Pour parler de tout, et surtout de rien !
Avatar de l’utilisateur
BorisTS
Timide
Messages : 120
Inscription : 29 janv. 2018, 13:10

StateDuration semble ne plus fonctionner

Message par BorisTS » 22 mai 2018, 12:51

Hello,

Depuis le passage en 3.2.7 mon scenario (que je n'ai pas touché depuis des semaines) utilisant StateDuration ne fonctionne plus.

Mon Si :

StateDuration(#[Maison][Présence Moi][Présence]#,1) > 130 ET StateDuration(#[Maison][Présence Elle][Présence]#,1) > 130 ET #[Maison][Ping ARP Moi][Etat]# == 0 ET #[Maison][Ping ARP Elle][Etat]# == 0

Dans le log je trouve ça :

[SCENARIO] Start : Scenario lance manuellement.
[2018-05-22 12:46:12][SCENARIO] Exécution du sous-élément de type [condition] : if
[2018-05-22 12:46:13][SCENARIO] Evaluation de la condition : [150 > 130 ET 129 > 130 ET 0 == 0 ET 0 == 0 ] = Faux
[2018-05-22 12:46:13][SCENARIO] Non exécution des actions pour cause de répétition
[2018-05-22 12:46:13][SCENARIO] Fin correcte du scénario

Les valeurs 150 et 129 reste bloquées alors qu'elle devrait augmenter à mesure que le temps passe.

Serais-ce un bug du core ?

Merci pour votre aide et suggestions.
Jeedom smart en 3.2.10, gateway Xiaomi avec divers capteurs, interrupteurs, lampes etc , Philips Hue, MyStrom, Logitech Harmony.

Avatar de l’utilisateur
BorisTS
Timide
Messages : 120
Inscription : 29 janv. 2018, 13:10

Re: StateDuration semble ne plus fonctionner

Message par BorisTS » 25 mai 2018, 21:11

Est-ce que je suis le seul avec ce problème ?
Jeedom smart en 3.2.10, gateway Xiaomi avec divers capteurs, interrupteurs, lampes etc , Philips Hue, MyStrom, Logitech Harmony.

jerryzz
Timide
Messages : 26
Inscription : 18 janv. 2018, 11:53

Re: StateDuration semble ne plus fonctionner

Message par jerryzz » 13 juin 2018, 15:24

J'ai un pb identique sur lastStateDuration (voir mon post viewtopic.php?p=626061 )

Avatar de l’utilisateur
bartounet
Actif
Messages : 1628
Inscription : 14 juil. 2016, 10:09

Re: StateDuration semble ne plus fonctionner

Message par bartounet » 13 juin 2018, 19:12

Pas de problème pour moi
Image
Jeedom à jour Debian 9
VM VMWARE ESXi 6.7 ( SSD)
Stick ZWave / FIBARO / Ikea Light / Yeelight / Google Home
Wifi Unifi / PFSENSE / Reverse Proxy DMZ SSL

Passionné de bidouillage informatique en tout genre
Mon blog : http://blog.info16.fr

Avatar de l’utilisateur
Antoinekl1
Actif
Messages : 2834
Inscription : 23 mai 2015, 08:14

Re: StateDuration semble ne plus fonctionner

Message par Antoinekl1 » 23 juin 2018, 15:49

Chez moi aussi mon lastStateDuration deconne

lastStateDuration(#[Divers][Boite au lettre][ETAT]#,0)

Attention : il doit y avoir un souci, car le résultat est le même que l'expression
Je vais évaluer : 4
Résultat : 4

La valeur n'évolue pas et cela fait plus de 4s que l'état est à 0
Screenshot_20180623-154629.png
Screenshot_20180623-154629.png (882.29 Kio) Consulté 376 fois
Dernière édition par Antoinekl1 le 23 juin 2018, 21:05, édité 1 fois.
JEEDOM Smart Ultimate + 40 modules zwave et 1BLEA
A vendre ; pack POWER jeedom - Console Clazio sous Android 6

Avatar de l’utilisateur
tomdom
Actif
Messages : 587
Inscription : 14 nov. 2016, 05:46

Re: StateDuration semble ne plus fonctionner

Message par tomdom » 23 juin 2018, 17:03

Bonjour,
Antoinekl1 a écrit :
23 juin 2018, 15:49

lastStateDuration(#[Divers][Boite au lettre][ETAT]#,1)

La valeur n'évolue pas et cela fait plus de 4s que l'état est à 0
ça me paraît normal non ? La dernière durée de l'état 1 est de 4s. Il n'y a pas de raison pour que ça évolue.

C'est lastChangeStateDuration(#[Divers][Boite au lettre][ETAT]#,1) qui doit évoluer.
Il y a 10 catégories de personnes, celles qui connaissent le binaire et les autres
.

Avatar de l’utilisateur
Antoinekl1
Actif
Messages : 2834
Inscription : 23 mai 2015, 08:14

Re: StateDuration semble ne plus fonctionner

Message par Antoinekl1 » 23 juin 2018, 21:07

tomdom a écrit :
23 juin 2018, 17:03
Bonjour,
Antoinekl1 a écrit :
23 juin 2018, 15:49

lastStateDuration(#[Divers][Boite au lettre][ETAT]#,1)

La valeur n'évolue pas et cela fait plus de 4s que l'état est à 0
ça me paraît normal non ? La dernière durée de l'état 1 est de 4s. Il n'y a pas de raison pour que ça évolue.

C'est lastChangeStateDuration(#[Divers][Boite au lettre][ETAT]#,1) qui doit évoluer.
Erreur de copie/coller, j'ai corrigé mon message

C'est lastStateDuration(#[Divers][Boite au lettre][ETAT]#,0) qui le donne 4 alors qu'il devrait évoluer

lastStateDuration(#[Divers][Boite au lettre][ETAT]#,1) donne 10507 ce qui n'est pas logique vue la durée de l'état 1 présent sur le graphe
JEEDOM Smart Ultimate + 40 modules zwave et 1BLEA
A vendre ; pack POWER jeedom - Console Clazio sous Android 6

Avatar de l’utilisateur
Antoinekl1
Actif
Messages : 2834
Inscription : 23 mai 2015, 08:14

Re: StateDuration semble ne plus fonctionner

Message par Antoinekl1 » 25 juin 2018, 10:16

J'ai ouvert un ticket au support, il y a bien un soucis d'identifié mais la réponse ne présage pas de solution rapide.
Oui globalement toute les fonction de ce type son bugué nous n'arrivons pour l'instant pas a les rendre fiable.
EDIT
On chercher mais non c'est compliqué la surtout que ces fonctions ont été faite par la communauté et les personnes qui les ont faite ne sont plus la.
Alors les experts du dev, un petit coup de main pour régler ca ? :-)

@kiboost si tu passes dans les parages...
JEEDOM Smart Ultimate + 40 modules zwave et 1BLEA
A vendre ; pack POWER jeedom - Console Clazio sous Android 6

Avatar de l’utilisateur
kiboost
Actif
Messages : 875
Inscription : 19 déc. 2017, 15:02
Localisation : France, Bretagne

Re: StateDuration semble ne plus fonctionner

Message par kiboost » 26 juin 2018, 09:38

Antoinekl1 a écrit :
25 juin 2018, 10:16
@kiboost si tu passes dans les parages...
En effet, je constate aussi pas mal de bug.

J'ai l'impression que c'est surtout sur les répétitions de valeurs, que je n'ai que rarement donc çà ne m'a jamais posé de problème. Qui plus est, avec des changements fréquents çà peut ne pas se voir, mais avec des changements moins fréquent là çà saute aux yeux.

J'ai regardé rapido, j'ai refais une fonction lastStateDuration() qui fonctionne bien.

Je vais voir pour lastChangeStateDuration() et stateDuration().

Je verrai ensuite pour les incorporer dans le core sur mon jeedom de test. Ensuite, ou proposer une solution de test ici, ou pousser un PR et voir avec Loic.

Par contre désolé, impossible de donnée une deadline, suis en mode cool 8-)

Prod : Jeedom Stable sur Smart | Z-wave
Synology DS1512+|Rpis Kodi|Qivivo|Netatmo
Market

Avatar de l’utilisateur
kiboost
Actif
Messages : 875
Inscription : 19 déc. 2017, 15:02
Localisation : France, Bretagne

Re: StateDuration semble ne plus fonctionner

Message par kiboost » 26 juin 2018, 10:18

A priori, ok aussi pour lastChangeStateDuration()

Par contre là, petite subtilité :

J'ai une prise éteinte actuellement, que j'ai éteint il y a 10mins.

stateDuration(prise) -> retourne 10mins
stateDuration(prise,0) -> c'est sont état actuel, donc on retourne 10mins
stateDuration(prise,1) -> elle n'est pas dans cet état, donc on retourne quoi ???? çà va être comme un lastStateDuration(prise,1) ??

Prod : Jeedom Stable sur Smart | Z-wave
Synology DS1512+|Rpis Kodi|Qivivo|Netatmo
Market

Avatar de l’utilisateur
kiboost
Actif
Messages : 875
Inscription : 19 déc. 2017, 15:02
Localisation : France, Bretagne

Re: StateDuration semble ne plus fonctionner

Message par kiboost » 26 juin 2018, 10:41

En fait je suis en train de me dire que stateDuration() ne devrait même pas prendre de valeur.

En gros, c'est 'durée de l'état actuel de l'équipement'

Et on fait SI #[prise][Etat]# == 0 ET stateDuration(#[prise][Etat]#) > 60 ALORS ...

Non ?

Je suppute également que les fonctions stateChanges() et duration() soient buggées aussi ... ? Vais pas refaire toute la class history :roll:

Prod : Jeedom Stable sur Smart | Z-wave
Synology DS1512+|Rpis Kodi|Qivivo|Netatmo
Market

Avatar de l’utilisateur
Antoinekl1
Actif
Messages : 2834
Inscription : 23 mai 2015, 08:14

Re: StateDuration semble ne plus fonctionner

Message par Antoinekl1 » 26 juin 2018, 11:07

@kiboost, merci :-)

dans la doc, pour certaine cas il retourne des -1 et des -2

Retourne -1 si aucun historique n’existe ou si la valeur n’existe pas dans l’historique. Return -2 si la commande n’est pas historisée
JEEDOM Smart Ultimate + 40 modules zwave et 1BLEA
A vendre ; pack POWER jeedom - Console Clazio sous Android 6

Avatar de l’utilisateur
kiboost
Actif
Messages : 875
Inscription : 19 déc. 2017, 15:02
Localisation : France, Bretagne

Re: StateDuration semble ne plus fonctionner

Message par kiboost » 26 juin 2018, 11:15

Oui j'ai fais pareil. Mais concernant le stateDuration() je ne vois pas la logique de pouvoir passer une valeur qui n'est pas la valeur actuelle.

Prod : Jeedom Stable sur Smart | Z-wave
Synology DS1512+|Rpis Kodi|Qivivo|Netatmo
Market

Avatar de l’utilisateur
kiboost
Actif
Messages : 875
Inscription : 19 déc. 2017, 15:02
Localisation : France, Bretagne

Re: StateDuration semble ne plus fonctionner

Message par kiboost » 26 juin 2018, 11:43

Voici une procédure de test pour ces fonctions :

stateDuration(commandeID)
lastChangeStateDuration(commandeID,valeur)
lastStateDuration(commandeID,valeur)

Pour chaque fonction:
commandeID est l'ID de la commande, pas son #nom# ! On verra plus tard pour l'usage normal.
Retourne -1 si aucun historique n’existe ou si la valeur n’existe pas dans l’historique.
Retourne -2 si la commande n’est pas historisée

Procédure:

Menu Configuration, _OS_DB, Lancer l'éditeur de fichiers
Editer le fichier data/php/user.function.class.php

Si vous ni avez jamais touché, vous pouvez tout remplacer par le code suivant. Sinon fait un ctrl+A et ctrl+C puis conserver le ailleurs.

Code : Tout sélectionner

<?php

/* This file is part of Jeedom.
 *
 * Jeedom is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Jeedom is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Jeedom. If not, see <http://www.gnu.org/licenses/>.
 */

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

class userFunction {

	public static function plop($_arg1 = '') {
		return 'Argument 1 : ' . $_arg1;
	}
  
    //core/history.class.php enhancement testing:
	public static function stateDuration2($_cmdId)
	{
	  /*
	  stateDuration(commande,[valeur]) : Donne la durée en secondes depuis le dernier changement de valeur.
	  Retourne -1 si aucun historique n’existe ou si la valeur n’existe pas dans l’historique.
	  Retourne -2 si la commande n’est pas historisée
	  */
	  echo 'STARTING__stateDuration: '.$_cmdId."\n";
	  $cmd = cmd::byId($_cmdId);
	  if (!is_object($cmd)) throw new Exception(__('Commande introuvable : ', __FILE__) . $_cmdId);
	  if ($cmd->getIsHistorized() != 1) return -2;

	  $histories = array_reverse(history::all($_cmdId));
	  $currentValue = $histories[0]->getValue();
	  $dateTo = date('Y-m-d H:i:s');
	  $duration = strtotime($dateTo) - strtotime($histories[0]->getDatetime());

	  $c = count($histories);
	  for ($i=0; $i<$c-1; $i++)
	  {
	    $history = $histories[$i];
	    $value = $history->getValue();
	    $date = $history->getDatetime();
	    echo 'hist: '.$value.':'.$date.'      duration:'.$duration."\n";

	    $nextValue = $histories[$i+1]->getValue();
	    if ($currentValue != $nextValue)
	    {
	      return $duration;
	    }

	    if ($i > 0) $duration += strtotime($histories[$i-1]->getDatetime()) - strtotime($date);
	  }
	  return -1;
	}

	public static function lastChangeStateDuration2($_cmdId, $_value=null) //OK!
	{
	  /*
	  lastChangeStateDuration(commande,valeur) : Donne la durée en secondes depuis le dernier changement d’état à la valeur passée en paramètre.
	  Retourne -1 si aucun historique n’existe ou si la valeur n’existe pas dans l’historique.
	  Retourne -2 si la commande n’est pas historisée
	  */
	  echo 'STARTING__lastChangeStateDuration:'.$_cmdId.':'.$_value."\n";
	  $cmd = cmd::byId($_cmdId);
	  if (!is_object($cmd)) throw new Exception(__('Commande introuvable : ', __FILE__) . $_cmdId);
	  if ($cmd->getIsHistorized() != 1) return -2;
	  $_value = str_replace(',', '.', $_value);

	  $histories = array_reverse(history::all($_cmdId));
	  $currentValue = $histories[0]->getValue();
	  $dateTo = date('Y-m-d H:i:s');
	  $duration = strtotime($dateTo) - strtotime($histories[0]->getDatetime());
	  if ($_value === null || $_value == $histories[0]->getValue())
	  {
	    $_value = $histories[0]->getValue();
	  }

	  $c = count($histories);
	  for ($i=0; $i<$c-1; $i++)
	  {
	    $history = $histories[$i];
	    $value = $history->getValue();
	    $date = $history->getDatetime();
	    echo 'hist: '.$value.':'.$date.'      duration:'.$duration."\n";

	    //same state as current:
	    if ($_value == $currentValue)
	    {
	      $nextValue = $histories[$i+1]->getValue();
	      if ($_value != $nextValue)
	      {
	        return $duration;
	      }
	    }

	    //different state as current:
	    if ($_value != $currentValue && $i > 0)
	    {
	      $prevValue = $histories[$i-1]->getValue();
	      $nextValue = $histories[$i+1]->getValue();
	      if ($_value == $value && $_value != $nextValue)
	      {
	        return $duration;
	      }
	    }

	    if ($i > 0) $duration += strtotime($histories[$i-1]->getDatetime()) - strtotime($date);
	  }
	  return -1;
	}

	public static function lastStateDuration2($_cmdId, $_value=null) //OK!
	{
	  /*
	  lastStateDuration(commande,valeur) : Donne la durée en secondes pendant laquelle l’équipement a dernièrement eu la valeur choisie.
	  Retourne -1 si aucun historique n’existe ou si la valeur n’existe pas dans l’historique.
	  Retourne -2 si la commande n’est pas historisée
	  */
	  echo 'STARTING__lastStateDuration:'.$_cmdId.':'.$_value."\n";

	  $cmd = cmd::byId($_cmdId);
	  if (!is_object($cmd)) throw new Exception(__('Commande introuvable : ', __FILE__) . $_cmdId);
	  if ($cmd->getIsHistorized() != 1) return -2;
	  $_value = str_replace(',', '.', $_value);

	  $histories = array_reverse(history::all($_cmdId));
	  $currentValue = $histories[0]->getValue();
	  $duration = 0;
	  $dateTo = date('Y-m-d H:i:s');
	  if ($_value === null || $_value == $histories[0]->getValue())
	  {
	    $_value = $histories[0]->getValue();
	    $duration = strtotime($dateTo) - strtotime($histories[0]->getDatetime());
	  }

	  $started = 0;
	  $c = count($histories);
	  for ($i=0; $i<$c; $i++)
	  {
	    $history = $histories[$i];
	    $value = $history->getValue();
	    $date = $history->getDatetime();
	    echo 'hist: '.$value.':'.$date.'      duration:'.$duration."\n";

	    //same state as current:
	    if ($_value == $currentValue && $_value != $value)
	    {
	      return $duration;
	    }

	    //different state as current:
	    if ($_value != $currentValue && $i > 0)
	    {
	      $prevValue = $histories[$i-1]->getValue();
	      if ($_value == $value && $_value != $prevValue)
	      {
	        $started = 1;
	        $duration = 0;
	      }

	      if ($i+1 < $c)
	      {
	        $nextValue = $histories[$i+1]->getValue();
	        if ($_value != $value && $_value == $nextValue && $started == 1)
	        {
	          return $duration;
	        }
	      }
	    }

	    if ($i > 0) $duration += strtotime($histories[$i-1]->getDatetime()) - strtotime($date);
	  }
	  return -1;
	}
}
Ensuite, créez un scénario test avec un bloc code:

Code : Tout sélectionner

require_once dirname(__FILE__) . '/../../data/php/user.function.class.php';

$cmdId = 332;

//$result = userFunction::stateDuration2($cmdId);
//$result = userFunction::lastChangeStateDuration2($cmdId,1);
$result = userFunction::lastStateDuration2($cmdId,1);
  
$resultMins = $result/60;
echo 'RESULT: '.$result.'sec | '.$resultMins.'mins';
$cmdId : c'est le commandeID (l'ID de votre #commande#)
commentez ou non en fonction de la fonction (!!) que vous voulez tester
Dans Analyse, Logs, regardez le log scenario_execution

So what ?

Et comme il y aura forcément des bugs, merci d'être le plus précis possible avec un maximum d'info, notamment le log de la dernière exécution (scenario_execution). Et vérifier avant, que vous comprenez bien ce qu'est sensé faire la fonction (voir doc scenario) et qu'effectivement le retour n'est pas cohérent par rapport à votre historique.

Si par miracle tout fonctionne, je l’intégrerai au core sur mon jeedom de test et je pousserai un PR. Mais on n'en est pas là !!
Dernière édition par kiboost le 26 juin 2018, 15:20, édité 2 fois.

Prod : Jeedom Stable sur Smart | Z-wave
Synology DS1512+|Rpis Kodi|Qivivo|Netatmo
Market

Avatar de l’utilisateur
kiboost
Actif
Messages : 875
Inscription : 19 déc. 2017, 15:02
Localisation : France, Bretagne

Re: StateDuration semble ne plus fonctionner

Message par kiboost » 26 juin 2018, 13:23

Loic si tu passe par là, après avoir testé sur ma config j'ai poussé un PR sur la branche alpha.
Certains auront sans doute du mal à tester donc autant le bébé aux beta testeurs ?

Prod : Jeedom Stable sur Smart | Z-wave
Synology DS1512+|Rpis Kodi|Qivivo|Netatmo
Market

Avatar de l’utilisateur
Antoinekl1
Actif
Messages : 2834
Inscription : 23 mai 2015, 08:14

Re: StateDuration semble ne plus fonctionner

Message par Antoinekl1 » 26 juin 2018, 14:02

kiboost a écrit :
26 juin 2018, 13:23
Loic si tu passe par là, après avoir testé sur ma config j'ai poussé un PR sur la branche alpha.
Certains auront sans doute du mal à tester donc autant le bébé aux beta testeurs ?
Merci !

je veux bien tester, si tu m'envois ton nouveau code et me dire dans quel fichier l'intégrer
JEEDOM Smart Ultimate + 40 modules zwave et 1BLEA
A vendre ; pack POWER jeedom - Console Clazio sous Android 6

Avatar de l’utilisateur
kiboost
Actif
Messages : 875
Inscription : 19 déc. 2017, 15:02
Localisation : France, Bretagne

Re: StateDuration semble ne plus fonctionner

Message par kiboost » 26 juin 2018, 14:04

Ou message au dessus, ou directement dans le core (pas en prod !!) :
https://github.com/jeedom/core/pull/109 ... 85317fd483

Prod : Jeedom Stable sur Smart | Z-wave
Synology DS1512+|Rpis Kodi|Qivivo|Netatmo
Market

Avatar de l’utilisateur
Antoinekl1
Actif
Messages : 2834
Inscription : 23 mai 2015, 08:14

Re: StateDuration semble ne plus fonctionner

Message par Antoinekl1 » 26 juin 2018, 14:38

kiboost a écrit :
26 juin 2018, 14:04
Ou message au dessus, ou directement dans le core (pas en prod !!) :
https://github.com/jeedom/core/pull/109 ... 85317fd483
désolé, j'avais loupé le message

j'ai qu'un jeedom de prod, mais j'ai confiance :-)

EDIT

j'ai modifié le fichier avec ton code mais il m'a affiché les menus avec les {{ }}..
JEEDOM Smart Ultimate + 40 modules zwave et 1BLEA
A vendre ; pack POWER jeedom - Console Clazio sous Android 6

Avatar de l’utilisateur
kiboost
Actif
Messages : 875
Inscription : 19 déc. 2017, 15:02
Localisation : France, Bretagne

Re: StateDuration semble ne plus fonctionner

Message par kiboost » 26 juin 2018, 15:17

Le user.function.class.php ou le core/class/history ?
Tu a bien remplacer tout le contenu du fichier, pas juste ajouté ? Sinon si le fichier php n'est plus valide çà peut poser problème.
Fait ce genre de modifs dans différents onglets du navigateur, çà permet de remettre facilement l'ancien contenu et sauvegarder.

Prod : Jeedom Stable sur Smart | Z-wave
Synology DS1512+|Rpis Kodi|Qivivo|Netatmo
Market

Avatar de l’utilisateur
Antoinekl1
Actif
Messages : 2834
Inscription : 23 mai 2015, 08:14

Re: StateDuration semble ne plus fonctionner

Message par Antoinekl1 » 26 juin 2018, 15:53

j'ai remplacé le contenu du fichier user.function.class.php avec ton code, après en avoir fait une copie en ssh
JEEDOM Smart Ultimate + 40 modules zwave et 1BLEA
A vendre ; pack POWER jeedom - Console Clazio sous Android 6

Répondre

Revenir vers « Discussions Générales »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Google [Bot] et 3 invités