La fonction stateChanges ignore les changements de 0 à 1

Bonjour à tous,
J’ai un problème avec la fonction stateChanges. Visiblement elle ne se comporte pas comme elle devrait.
En effet, elle ne me renvoie pas le nombre de changements d’états mais seulement le nombre de passages à 0.
Voici l’expression utilisée :

stateChanges(#[Maison][Capteur aimant pluviomètre][contact]#, 1 hour)

Je souhaite récupérer le nombre de changements d’états (bascules du pluviomètre) sur la dernière heure. Je n’ai précisé que deux paramètres dans la fonction
stateChanges(commande,[valeur], période)
le paramètre valeur n’est pas spécifié, je devrais donc récupérer le nombre total de changements d’états. Pourtant, la valeur retournée n’augmente que quand l’état passe de 1 à 0, pas quand il passe de 0 à 1.
La valeur que je reçois serait cohérente si j’avais fait appel à cette fonction :

stateChanges(#[Maison][Capteur aimant pluviomètre][contact]#, 0, 1 hour)

où il est précisé qu’on ne souhaite que les changements vers la valeur 0.

Ma solution pour contourner le problème est pour moi d’utiliser cette expression

stateChanges(#[Maison][Capteur aimant pluviomètre][contact]#, 0, 1 hour) + stateChanges(#[Maison][Capteur aimant pluviomètre][contact]#, 1, 1 hour)

Qui me renvoie le nombre de changements vers 0 + le nombre de changements vers 1
Il me semble que ça montre bien que le problème vient d’un bug dans la fonction stateChanges.
Qu’en pensez-vous ?

Avec quelle version de Jeedom ?

La dernière version il me semble, v4.3.23

Salut,

Dans le code du core on a :

		if ($_value === null) {
			$_value = $cmd->execCmd();
		}

Donc le comportement est qu’en cas de non spécification de l’état lors de l’appel de stateChanges, le core récupère la valeur actuelle de la commande pour déterminer le nombre de changement d’état.

Donc à première vue, pas de bug, c’est fait comme ça.

Et comme dans la doc c’est bien spécifié : « ou si non indiqué par rapport à sa valeur actuelle » alors tout va bien :slight_smile:

  • stateChanges(commande,[valeur], période) & stateChangesBetween(commande, [valeur], start, end) : Donnent le nombre de changements d’état (vers une certaine valeur si indiquée, ou si non indiqué par rapport à sa valeur actuelle) sur la période (period=[month,day,hour,min] ou expression PHP) ou entre les 2 bornes demandées (sous la forme Y-m-d H:i:s ou expression PHP).

En fait visiblement le comportement de la fonction a changé à partir de la version 4.1 de Jeedom, dans la documentation de la version 4.0, on trouve :
" * stateChanges(commande,[valeur], période) et stateChangesBetween(commande, [valeur], start, end) : Donnent le nombre de changements d’état (vers une certaine valeur si indiquée, ou au total sinon) sur la période (period=[month,day,hour,min] ou expression PHP) ou entre les 2 bornes demandées (sous la forme Y-m-d H:i:s ou expression PHP)."

Je n’avais pas fait attention à la version de la doc sur laquelle j’étais.
Mais je ne comprends pas vraiment pourquoi ce changement, en fait je ne suis pas sûr de comprendre ce que veut dire « par rapport à sa valeur actuelle ».
Mon capteur passe de 0 à 1 puis de 1 à 0, dans les deux cas la fonction me renvoie la même valeur parce qu’en fait ce sont deux compteurs différents, qui ont bien tous les deux été incrémentés mais qui ont juste la même valeur, c’est bien ça ?
Personnellement je trouve ce fonctionnement moins pertinent vis à vis du nom de la fonction que le fonctionnement de la v4.0, mais ça n’est que mon avis
Merci d’avoir jeté un œil en tous cas

C’est simple, au moment d’appeler la fonction, Jeedom regarde quelle valeur la commande a et utilise cette valeur pour sortir le nombre de changement.

Si ta commande est à 1 quand tu appelles stateChange, Jeedom regardera le nombre de changement avec la valeur 1.

J’ai rien compris :upside_down_face:

Je ne trouve pas d’exemple pour te contredire. A mon sens si on ne spécifie pas de valeur la fonction devrait retourner le nombre total de changement.

Enfin bon maintenant que tu le sais :slight_smile:

Sinon je ne comprends pas trop ton cas de figure. Un capteur de pluviométrie passe à 1 quand l’eau dépasse une valeur et il me semble que c’est intéressant de savoir combien de fois ça arrive dans l’heure. Mais je ne comprends pas à quoi ça sert de compter aussi le nombre de retour à 0. Peut-être que c’est suivant le matériel que tu as (je n’ai pas de capteur de ce genre).

Je t’invite à fermer le sujet avec la Solution de mon 1er post si c’est bon pour toi :slight_smile:

Ok donc c’est bien ce que j’avais compris.
Imaginons que mon capteur passe de 0 à 1. Ça déclenche l’appel à la fonction, qui voit qu’on est à 1 et qui calcule donc le nombre de passages de 0 à 1 et me sort une valeur, disons 100. De part la nature du capteur, si il a capté 100 fois que l’aimant arrivait à portée, il a forcément déjà capté 99 fois que l’aimant n’était plus à portée. Donc quand il passera de 1 à 0, ça sera la 100eme fois que l’aimant s’éloigne, donc le 100ème passage de 1 à 0, et comme 0 est la valeur actuelle, là aussi la fonction me retourne 100, d’où le fait que je n’ait qu’un changement d’état sur deux qui mène à une augmentation de la valeur retournée. Est-ce que c’est plus clair ? :sweat_smile:

Concernant le pluviomètre, j’utilise le système décrit ici

Il est basé sur un système à bascule, chaque bascule correspond à un volume d’eau donné, d’où l’importance de prendre en compte les deux changements d’état.
Si je ne prends en compte que les changements de 0 à 1 par exemple, je peux multiplier par 2 la quantité d’eau liée au changement, mais du coup je divise par 2 la résolution du système

C’est très clair, il faut donc effectivement prendre en compte le passage de 0 à 1 et de 1 à 0 :slight_smile:

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