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 :)

Le groupe des Helpers est present pour vous aidez, n'hésitez pas à poser des questions ;)

Toute la communauté vous remercie

Scénario annule le précédent

Réservé à la création de scénarios dans JEEDOM
Worldofdada
Timide
Messages : 8
Inscription : 24 déc. 2018, 14:21

Scénario annule le précédent

Message par Worldofdada » 06 janv. 2019, 14:40

Bonjour

Afin de piloter mes volets roulants (VR), j'ai mis en place plusieurs scénarios et un virtuel.

Virtuel "Tous les VR"
Un numérique "Etat" égal à
-1 si Descente demandée
0 si Stop demandé
1 si Montée demandée

Scénario "VR Générique"
Prend en entrée le nom du VR ainsi qu'une action (Up / Stop / Down)
Lance l'action, et fait un Stop lorsque le volet est en butée (protection)

1 scénario "Tous les VR"
Provoqué par la modif de l'état du virtuel "Tous les VR" et converti la valeur numérique (-1, 0 et 1) en Action (Down, Stop et Up)
Regarde sa valeur, et appelle le scénario "VR générique" pour tous les VR avec l'action associée.

Ce fut long, mais on arrive à mon principal problème.
Lorsque je change la valeur du virtuel "Tous les VR", ca fonctionne.
Par contre, les modifications du virtuel ne sont pas prises en compte si le scénario est en cours d'exécution.
Exemple :
Je dis "Down" puis "Stop" => Les VR continuent de descendre.

Je peux le passer en multi lancement, mais ca n'arretera pour autant pas la précédente exécution.

Je vois 2 possibilités, sans savoir comment faire :
- Le scénario est mono lancement, et la dernière demande a raison (annulation automatique de l'exécution en cours avant de lancer la nouvelle)
- Multi lancement, et je récupère le scénario portant le même nom mais n'étant pas moi pour l'annuler

Avez vous compris ma problématique et auriez vous une idée ?

Merci

Worldofdada
Timide
Messages : 8
Inscription : 24 déc. 2018, 14:21

Re: Scénario annule le précédent

Message par Worldofdada » 13 janv. 2019, 14:47

Personne ? :(

Naboleo
Actif
Messages : 675
Inscription : 20 janv. 2017, 09:57

Re: Scénario annule le précédent

Message par Naboleo » 13 janv. 2019, 18:34

@Worldofdada

Je vois pas trop comment fonctionne ton scénario "générique" (ça m’intéresse d'avoir quelques infos sur ta méthode)
Pour ton souci, sans trop de précision sur ce que ça fait, il reste à voir si une autre approche est possible :
  • 1 virtuel avec tes 3 actions (Up/Stop/Down)...
  • A chacune des actions tu associes les actions Up/Stop/Down des tes volets, dans le mécanisme
    volet 1er.PNG
    volet 1er.PNG (106.25 Kio) Consulté 201 fois
L'avantage, c'est qu'il n'y a pas de scénario, et donc ça permet d'envoyer les actions assez rapidement et sans contraintes d'attente et en parallèle si besoin
Par contre, impossible d'y ajouter des tests/etc comme pour les scénarii

Pour aller plus loin, tu peux "chaîner" les virtuels pour définir des zones par exemple :
  • Maison = RDC +1er
  • RDC = Volets A/B/C/D
  • 1er = Volets E/F/G/H
Pi3 +SSD 32Go (Wifi et bluetooth actifs) + Clé USB Z-Wave Everspring + rfxcom (RTS) + Google Home
7 Danfoss LC-13
2 velux module DIO
7 volets RTS
3 Sonoff
IFTTT
Capteur porte, de présence, et prise intelligente...

Worldofdada
Timide
Messages : 8
Inscription : 24 déc. 2018, 14:21

Re: Scénario annule le précédent

Message par Worldofdada » 13 janv. 2019, 19:22

Plus d'explications sur mes problématiques : l'installateur m'a conseiller de revenir à la position STOP (bouton) une fois le volet en butée.
Bête et discipliné, je veux faire pareil lorsque je le pilote via les micro modules.

J'ai voulu factoriser le code :
1 scénario pour piloter un volet quelconque, à partir d'un nom de VR et d'une action
Autant de scénario que de VR pour éviter d'utiliser les noms un peu partout

L'objectif étant de pouvoir y associer un virtuel pour en piloter plusieurs à la fois, mais aussi la météo, le coucher du soleil, pourquoi pas une détection de présence, ...

Ta solution est effectivement interessante, je n'y avais pas pensé.
Par contre, ca m'obligerait à faire STOP une fois les actions UP / DOWN terminées.
Ca règlerait ce problème, mais pas mon deuxième (voir lien à la fin) si je continue à utiliser le scénario générique

Les pièces de code ci-dessous sont en cours de construction, il y a peut être des choses à revoir.

Mon scénario générique :

Code : Tout sélectionner

/* Définition des constantes */
/*****************************/
$actionUp = "Up";
$actionStop = "Stop";
$actionDown = "Down";
$actionEtat = "Etat";
$actionRafraichir = "Rafraichir";

/* Construction de toutes les commandes */
/****************************************/
$tags = $scenario->getTags();

$nomVR = $tags['#VR#'];
$nomVR = str_replace("\"", "", $nomVR);
$action = $tags['#Action#'];

$commande = cmd::byString('#'.$nomVR.'['.$action.']#');
$commandeStop = cmd::byString('#'.$nomVR.'['.$actionStop.']#');
$commandeRafraichir = cmd::byString('#'.$nomVR.'['.$actionRafraichir.']#');
$commandeEtat = cmd::byString('#'.$nomVR.'['.$actionEtat.']#');

/* Exécution de la commande */
/****************************/
$commande->execCmd();

/* Attente de la fin d'exécution avant Stop */
/********************************************/
if($action != $actionStop)
{
  // Définition des constantes d'attente
  $dureeAttenteMax = 60;
  $delaiRafraichissementEtat = 5;
  
  // Récupération de l'état initial
  $commandeRafraichir->execCmd();
  $etat = $commandeEtat->execCmd();
  $scenario->setLog($etat);

  $stop = false;
  $nbSecEcoulees = 0;
  $dureeAttenteParBoucle = 1;
  $dureeVRArret = 0;
  while(!$stop && $nbSecEcoulees < $dureeAttenteMax)
  {
    // Attente de N secondes
    sleep($dureeAttenteParBoucle);
    $nbSecEcoulees += $dureeAttenteParBoucle;

    // Récupération de l'état après une seconde d'attente
    $commandeRafraichir->execCmd();
    $etatApresAttente = $commandeEtat->execCmd();
    $scenario->setLog($nbSecEcoulees.' sec - '.$etat.' => '.$etatApresAttente);
    
    // Arrêt du traitement si l'état n'a pas bougé (fin de course ou Stop par un autre commande)
    // Le rafraichissement de l'état n'est pas immédiat = attente de N secondes nécessaires avant de considérer le VR comme figé
    if($etat == $etatApresAttente)
    {
      $scenario->setLog("Durée arrêt : ".$dureeVRArret);
      if($dureeVRArret >= $delaiRafraichissementEtat)
    	$stop = true;
      $dureeVRArret++;
    }
    else 
      $dureeVRArret = 0;

    // Arrêt du traitement si le volet est en butée
    if(($action == $actionUp && $etatApresAttente >= 99) || ($action == $actionDown && $etatApresAttente <= 0))
      $stop = true;
    
    // Arrêt du traitement si l'état ne va plus dans la bonne direction (Up par une autre commande alors qu'on était sur du Down, ou inversement
    if(($action == $actionUp && $etat > $etatApresAttente) || ($action == $actionDown && $etat < $etatApresAttente))
      $stop = true;

    $etat = $etatApresAttente;
  }
  $scenario->setLog("Fin en ".$nbSecEcoulees." secondes");

  /* Exécution de la commande Stop */
  /*********************************/
  $commandeStop->execCmd();
}
Exemple d'un scénario pour un VR :
1 action de type scénario générique
Tags : VR="[Volets roulants][VR 1er Fenêtre]" Action=#Action#

Pour info, j'ai un deuxième problème lié à ma tentative de factorisation de code :
viewtopic.php?f=32&t=42155

Je n'arrive pas à trouver comment faire pour avoir des variables d'entrées non globales sur des scénarios.

Naboleo
Actif
Messages : 675
Inscription : 20 janv. 2017, 09:57

Re: Scénario annule le précédent

Message par Naboleo » 13 janv. 2019, 19:44

@Worldofdada Merci pour ton scénario générique (dans un bloc php), ça donne une piste pour un de mes besoins.

Pour ton histoire de stop, j'imagine que ça dépends du modèle de tes volets. Sur les somfy RTS, c'est inutile...
Malgré tout si un réel besoin il reste une solution, c'est ce que je fais pour mes Velux (module DIO en parallèle des commandes filaires) dans un virtuel, car la fonction sleep fonctionne
-Monter
-Sleep X
-Stop (chez moi c'est Monter à la place équivalent on/off)
tempo.PNG
tempo.PNG (26.79 Kio) Consulté 183 fois
Reste juste à estimer la durée X de la tempo...

Pour ton parallélisme, et puisque les actions peuvent être paralèllisée (cf petit coche en face des actions) est-ce vraiment encore utile ?
Par exemple les 9 volets se réagissent dans la même seconde, quelque soit la commande up/Stop/Down
Pi3 +SSD 32Go (Wifi et bluetooth actifs) + Clé USB Z-Wave Everspring + rfxcom (RTS) + Google Home
7 Danfoss LC-13
2 velux module DIO
7 volets RTS
3 Sonoff
IFTTT
Capteur porte, de présence, et prise intelligente...

Worldofdada
Timide
Messages : 8
Inscription : 24 déc. 2018, 14:21

Re: Scénario annule le précédent

Message par Worldofdada » 14 janv. 2019, 19:38

Pourquoi pas, mais est ce que ca résoudrait mon pb ?

Je n'ai pas eu le temps de tester, mais si je lance un Down sur mes volets.
Puis un Stop => Est ce que ca annulera les précédents Down ?

(et j'aurais de toute facon le même pb avec les tags qui sont "globaux", cf 2eme post)

Naboleo
Actif
Messages : 675
Inscription : 20 janv. 2017, 09:57

Re: Scénario annule le précédent

Message par Naboleo » 14 janv. 2019, 22:58

Voici quelques remarques en vrac :

Supposons que la commande stop soit indispensable pour tes volets. Sans description du matériel, difficile à confirmer.

Dans le fonctionnement que je décris, et à condition de n'avoir qu'à ouvrir/stopper/fermer les volets : pas besoin d'aucun scénario, ni de tags, il n'y a que des virtuels et des actions... Les tempos sont gérer directement par Jeedom...

Alors ça peut ne pas répondre à un besoin de type ouvrir pendant 3 secondes et stop, mais j'ai très rapidement regarder ton code, sans m'attarder sur tes histoires de tempo etc... Je me trompe peut-être sur ton usage.

A ta place, je ferrais ça sur 2 volets pour commencer (donc 1 virtuel comme ma dernière capture d'écran), je confirme que ça fonctionne. Ensuite je ferais un volet "double" qui commande les 2 virtuels précédents... Etc...
Tu peux très bien faire ça sans casser l'existant...
Pi3 +SSD 32Go (Wifi et bluetooth actifs) + Clé USB Z-Wave Everspring + rfxcom (RTS) + Google Home
7 Danfoss LC-13
2 velux module DIO
7 volets RTS
3 Sonoff
IFTTT
Capteur porte, de présence, et prise intelligente...

Répondre

Revenir vers « Scénarios »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 0 invité