Afficher la durée restante avant retour d'état d'une commande

Bonjour,

Sauriez-vous comment récupérer pour affichage la durée restante avant retour d’état d’une commande svp ?
Cette « Durée avant retour d’état (min) » est un des paramètres de toute commande de type info.
Je n’ai rien trouvé sur le forum ou la documentation.

Plus généralement, est-il possible de récupérer

  • les paramètres statiques d’une commande ? exemple : dans ma commande la valeur du champ « Durée avant retour d’état (min) » vaut 30.
  • et dynamiques d’une commande ? exemple : la durée restante avant retour d’état vaut 13 mn.

Bonne semaine !

Bonjour,

Je n’ai jamais vue cela ici.

En fait, ce paramètre est surtout pour combler les lacunes de certains équipements qui n’ont pas de réel retour d’état :
- un bouton de sonnette RFXCom par exemple, au repos à 0, on le presse, il passe à 1 et fait l’action, mais reste à 1. Alors il faut utiliser cette valeur de retour d’état pour le forcer à retourner à 0 (sinon, il ne serait capable que de fonctionner 1 seule fois).

Des capteurs RFXcom ont aussi nativement ce retour d’état (pas besoin d’utiliser le retour d’étant planifié).

Les équipements qui ont un vrai retour d’état, n’ont pas ces valeurs, par défaut, c’est du temp réel.

Bonjour Fabrice,

D’accord, merci pour ton retour.
Moi j’utilise ce retour d’état pour minuterie virtuelle.
J’ai besoin de désactiver un brasseur d’air pendant 30 minutes.
Je me suis fait un bouton pause de 30 min avec retour d’état au bout de 30 minutes. Un scénario lancé régulièrement déclenche le brasseur d’air en fonction de l’état de ce bouton et de la température de l’air ambiant.

Ce retour d’état est utile pour des virtuels de type minuterie, en plus de palier aux lacunes d’équipements physiques.

Je vais demander au support du coup si ils ont un moyen de récupérer ces valeurs.

Bon weekend.

Bonjour,
Il y a une solution tres simple qui APPROCHE ta demande.
Sur l’ÉTAT de ton actionneur tu choisis (dans affichage) un widget perso.
Tu auras au préalable créer avec l’outil Widget, un widget d’état, où tu auras coché la case « temps de l’état » (je suis pas sur mon Jeedom, je peux pas te dire le nom exacte).
Si tu trouves pas, redis moi, je regarderai ce soir.

Cela va affiché le temps depuis el dernier changement d’état.

Pour aller plus loin, tu peux également créer un scénario qui se lance au pilotage de ton brasseur
puis en toute les 2 minutes recalculer le temps restant (il y a des opérateurs qui donne l’info du temps depuis un état donné) et piloter des virtuels intermédiaire (« pause en cours » / « pose finis » / etc…)

De façon général, la philosophie de Jeedom,
n’est pas d’avoir milliers de cases prévu pour chaque application particulière (le support ne va pas créer un truc que pour toi… Sorry !)
Mais plutot d’avoir un outil ultra puissant qui te permettent de tout (ou presque) programmer.
Avec les outils « Scénario » + « Virtuel », du temps et ton imagination sont les seuls limites…

1 « J'aime »

Merci fabrice pour le :heart:
Ca fait un bon debut de journée
:slight_smile:

Te souhaitant une excellente journée !

Merci Henri pour ta réponse (après quelques mois - je ne me suis pas replongé sur mon pb comme tu le vois -)

Je n’ai pas bien saisi ton point sur le Widget ETAT. Je suis preneur de ta solution stp.

Il ne s’agit pas d’un « truc à créer que pour moi » ultra-spécifique.
1- Les comptes à rebours sont largement utilisés en domotique et automatisation, donc offrir cette fonctionnalité à la communauté me paraît utile et profitera à de nombreuses personnes.
2- Il s’agit de pouvoir lire tous les attributs d’une commande qu’ils soient statiques (base de données) ou dynamiques (à part le retour d’état je n’en vois pas), sachant que le système y a accès.
C’est juste l’API public qui n’expose pas encore tout. Si l’équipe de dev peut donner accès à cette valeur autant leur demander.
Si cela n’est pas souhaité, je réinventerai la roue…

Je peux effectivement recalculer ce qui est déjà calculé par le système. Je sais qu’on peut tout faire. On peut aussi recoder Jeedom ou le forker.
C’est dommage d’utiliser de la ressource pour ça et de réinventer la roue alors que le système a l’information et la calcule.

De manière générale, il serait bien que tout nouvel attribut ajouté à un objet (au sens modèle de données, ie équipement, commande etc…) soit lisible via l’API par défaut. Cela libèrerait le potentiel de Jeedom et éviterait que des tas de gens cherchent à récupérer tel ou tel info pour répondre à leur besoin.

J’ai déjà fait des demandes à l’équipe qui en a vu l’intérêt. Je vais essayer pour celle-ci. On ne sait jamais. Si ça peut me servir et servir à d’autres… :slight_smile:

Bonjour @fls
Reprenons au début !

Oui, c’est un paramètre de toute commande de type Information, mais… j’ai 2319 commandes, et je n’ai jamais utilisé ce paramètre !
Comme te l’a dis @Fabrice c’est pour une utilisation ultra particulière, à utiliser si le retour d’état ne se fait pas.
De façon générique, dans l’immense majorité des cas, le retour d’état se fait. Et donc… pas besoin d’utiliser cette fonction.
Le cas d’un virtuel, le retour d’état des instantané (On fait un off, l’état passe à Off)
Le cas d’un module, le retour d’état correspond au temps de communication / au temps que le module renvoie son nouvel état (entre quelque dixaines de millisecondes -Zigbee- à quelque secondes grand max en Z-wave).
Bref, ce n’est pas une utilisation courante.

Je ne connait pas assez Jeedom et encore moins la programmation bas niveau, mais je peux dire sans trop de risque de me tromper que cette fonction n’est pas réalisé avec un compte à rebours. Quand l’état change, le système ne se mets pas à calculer un compte à rebours, puis au bout de celui-ci, enclenche une action. Pour ce type d’action (comme avec un Sleep, un Dans), le système va se mettre un rappel. Il va calculer l’heure à laquelle il doit faire une action (ici ramener l’état à une certaine valeurs) exemple il est 11h31 et 20 secondes, dans 10 minutes il sera 11 h 41 et 20 seconde. Puis, quand il sera 11 h 41 et 20 secondes, il va effectué la tache attendu.
Bref: Non, ce n’est pas juste un affichage / juste l’API qui n’expose pas tout (dans ce cas), ce compte à rebours n’existe pas dans Jeedom. (Si c’est une bêtise, je laisse l’équipe Jeedom me corriger).

Dans les widgets (Menu « Outil / Widget ». Voir doc + forum, mais c’est assez simple à utiliser), il y a une case « Time widget » à cocher. Cela te permet (doc):


Exemple:
Capture d’écran 2021-12-22 à 11.43.17
Cela indique que la détection est passé à 0, il à 7 minutes et 39 secondes.
Il se configure ainsi:

Enfin,
si tu veux réaliser cette fonction, c’est possible !
Si ça t’intéresse de faire un scénario pour y parvenir, dit le moi !
Dans les grandes lignes / une première approche qui pourra être développé dans un second temps.
Tu crées un virtuel (qui s’appelle Pause Brasseur par exemple)
Tu mets:

  • une information binaire « Pause Etat »
  • Deux commande « Pause_On » et « Pause_Off »
  • Une information « Temps restant » qui prendra comme valeur la variable: variable(Brasseur tps restant)

Tu ajoutes un scénario qui se déclenche avec Pause Etat==1

  • qui commencera avec un Off sur le brasseur
  • puis une boucle toute les minutes pour incrémenter la variable « Brasseur tps restant »
    à la fin de celle-ci
  • On sur le brasseur
  • Pause_Off

Je te laisse avancer dessus et revenir avec des captures d’écran (virtuel + scénario) + descriptif du problème pour t’aider à avancer.

Merci @Henri .

Je n’ai pas les mêmes besoins que toi. Ca n’a rien à voir avec le nombre de commandes que tu as.
J’ai besoin d’afficher ou de récupérer les temps restants avant retour à l’état initial dans 5 applications différentes :

  • Temps restant avant reprise d’un brasseur d’air mis en pause forcée de 30 mn
  • Temps restant d’un minuteur de cuisine
  • Temps restant d’arrosage du jardin
  • Temps restant du cycle d’une couveuse avant de passer au cycle suivant
  • Temps restant d’un traitement thermique automatisé

J’ai vu que d’autres gens avaient des besoins similaires (comme Sarakha et sa tondeuse La domotique pour une Maison Connectée Élégante ou d’autres sur le forum. Il suffit de taper « minuteur ».)

Chacun trouve sa façon de faire.
Les scénarios sont une façon de faire, car on peut tout faire avec, mais je trouve dommage d’utiliser des scénarios pour ça. Je préfère les utiliser pour de l’automatisme ou des workflows.

J’ai donc développé les fonctions qui me manquaient et les ai ajoutées dans mon fichier user.function.class.php.

Voici les fonctions si d’autres souhaitent s’en inspirer voir compléter (par exemple modifier dynamiquement la valeur d’un retour d’état ou le temps avant retour d’état) :

// Retrieve returnStateTime configuration of a command
    public static function getCmdReturnStateTimeConfiguration($_cmd = '') {
		$cmd = cmd::byString($_cmd);
		if (is_object($cmd)) {
			return $cmd->getConfiguration('returnStateTime', null);
		}
	}

	// Retrieve returnStateValue configuration of a command
    public static function getCmdReturnStateValueConfiguration($_cmd = '') {
		$cmd = cmd::byString($_cmd);
		if (is_object($cmd)) {
			return $cmd->getConfiguration('returnStateValue', null);
		}
	}
  
    // Retrieve the scheduled timestamp when a command will return to its returnStateValue
  	public static function getCmdReturnStateScheduledTimestamp($_cmd = '') {
		$cmd = cmd::byString($_cmd);
		if (is_object($cmd)) {
			$value = $cmd->execCmd();
			if (is_numeric($cmd->getConfiguration('returnStateTime')) && $cmd->getConfiguration('returnStateTime') > 0 && $value != $cmd->getConfiguration('returnStateValue') && trim($cmd->getConfiguration('returnStateValue')) != '') {
                $cron = cron::byClassAndFunction('cmd', 'returnState', array('cmd_id' => intval($cmd->getId())));
                if (is_object($cron)) {
					$returnStateDate = $cron->getNextRunDate();
					$returnStateDateTime = DateTime::createFromFormat('Y-m-d H:i:s', $returnStateDate);
					return $returnStateDateTime->getTimestamp();
                }
            }
		}
	}
  
  
    // Retrieve the remaining time in seconds before a command returns to its returnStateValue
  	public static function getCmdReturnStateRemainingDuration($_cmd = '') {
		$cmd = cmd::byString($_cmd);
		if (is_object($cmd)) {
			$value = $cmd->execCmd();
			if (is_numeric($cmd->getConfiguration('returnStateTime')) && $cmd->getConfiguration('returnStateTime') > 0 && $value != $cmd->getConfiguration('returnStateValue') && trim($cmd->getConfiguration('returnStateValue')) != '') {
                $cron = cron::byClassAndFunction('cmd', 'returnState', array('cmd_id' => intval($cmd->getId())));
                if (is_object($cron)) {
					$now = new DateTime("now");
					$returnStateDate = $cron->getNextRunDate();
					$returnStateDateTime = DateTime::createFromFormat('Y-m-d H:i:s', $returnStateDate);
					return $returnStateDateTime->getTimestamp()-$now->getTimestamp();
                }
            }
		}
	}

    // Retrieve the remaining time in H:i:s before a command returns to its returnStateValue
	public static function getCmdReturnStateRemainingDurationHis($_cmd = '') {
		$seconds = self::getCmdReturnStateRemainingDuration($_cmd);
        if (is_numeric($seconds)) {
          return gmdate('H:i:s', $seconds);
        }
      	return $seconds;
	}

On peut ainsi les utiliser n’importe où : dans des scénarios, dans des commandes info virtuelles, …
Universel et je ne pollue pas ma liste de scénario d’un n-ème scénario spécifique.

Il me reste à travailler sur le widget pour avoir un timer dynamique tout en évitant de « rafraichir » la commande. Je ne souhaite pas solliciter inutilement Jeedom pour un besoin d’affichage dynamique.
Je pense utiliser le widget de @Bad qui répond à mon besoin Décompte à la seconde / Widgets v4 - #22 par Bad

PS : c’est effectivement un cron qui est lancé pour faire un retour d’état. Le cron disparaît une fois que le retour d’état a eu lieu → Pas de cron, pas de retour d’état en cours.
Je vais chercher les infos en base puisqu’il est associé à la commande.
Voir documentation de la fonction cmd->checkReturnState() (https://jeedom.github.io/documentation/phpdoc/classes/cmd.html)

public function checkReturnState($_value) {
		if (is_numeric($this->getConfiguration('returnStateTime')) && $this->getConfiguration('returnStateTime') > 0 && $_value != $this->getConfiguration('returnStateValue') && trim($this->getConfiguration('returnStateValue')) != '') {
			$cron = cron::byClassAndFunction('cmd', 'returnState', array('cmd_id' => intval($this->getId())));
			if (!is_object($cron)) {
				$cron = new cron();
			}
			$cron->setClass('cmd');
			$cron->setFunction('returnState');
			$cron->setOnce(1);
			$cron->setOption(array('cmd_id' => intval($this->getId())));
			$next = strtotime('+ ' . ($this->getConfiguration('returnStateTime') + 1) . ' minutes ' . date('Y-m-d H:i:s'));
			$cron->setSchedule(cron::convertDateToCron($next));
			$cron->setLastRun(date('Y-m-d H:i:s'));
			$cron->save();
		}
	}

Pour finir, un grand merci @kiboost pour son super article qui m’a donné la piste pour coder ses fonctions

L’article m’a donné des tas d’exemple de code et m’a mené à la doc officielle sur l’ajout de fonctions :
https://doc.jeedom.com/fr_FR/core/4.0/scenario#Ajout%20de%20fonction%20php
Merci également à de nombreux autres dont les exemples postés sur le forum m’ont permis d’ajuster ces fonctions. Comme @winhex : [tuto] bloc code PHP scénario (petite commande simple) - Forum Communauté Jeedom
Et enfin merci @Bad pour son tuto vidéo sur les Widgets, et son widget de décompte. Tout est dans cette discussion Décompte à la seconde / Widgets v4 - #22 par Bad

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.