Scène Déclencheur

Entièrement d’accord avec toi (au clic près exactement c’est la même chose)

Pour le reste, j’ai fait une demande pour répondre à mon besoin on me dit pas possible ou faut faire autrement, comme c’est frustrant je fais d’autre proposition autour qui pourrait contourner jusqu’à ce que @_Will_71 me propose une solution qui fonctionnes (merci encore :+1:) donc oui ma réflexion a évolué effectivement en fonction des réponses apportées et de ce que je comprenais en cours de route avec les réponses apportées (qui a dit c’est un macroniste dans la salle ? :rofl: « Seul les siths sont aussi absolu. » :crazy_face:)

Après ça reste le but d’un forum…et des fois il faut persévérer sans quoi je n’aurais pas réussi à relier Gladys à mon IPX800V5 via Node-red et piloter mes volets en fonction de la position du soleil, j’ai trouvé comment faire et partagé mon expérience via des mini-tutos :slight_smile: alors qu’initialement j’avais fait des demandes à @pierre-gilles (ou sur le forum dans les demande de features je me rappelle plus trop) et la réponse était dans l’actuel ce n’était pas possible et c’est au cours des discussions (car j’avais pas compris que la syntaxe mqtt soit pas standard) avec @pierre-gilles entre autre que j’ai compris comment fonctionnait gladys et donc comment faire en passant par Node-red, pareil pour la position du soleil, j’avais fait une requête pour cela on m’a répondu pas possible pour le moment j’ai contourné avec Node-red et maintenant je peux piloter les VR dans gladys en tenant compte de la position du soleil !
Ma démarche c’est « je veux faire quelque chose si je peux le faire en passant par la porte et bien essayons de voir si je peux le faire en passant par la fenêtre » et si j’y arrives j’en fait profiter les autres !

Là je comprend pas ta remarque en interne ce n’est pas la même logique d’un coté on a
OU dans la scène qui détecte si UN détecteur est ** OUVERT**

et de l’autre un ET dans ma 2de scène qui détecte si TOUS mes capteurs sont FERMES cela change la logique interne du traitement c’est pas juste un ajout de texte

Pour changer la façon dont sont interprétés les blocs il faudrait avoir le choix avec un toggle pour passer d’une logique « OU » à une logique « ET »

dans le 1er cas OU en algo
POUR CHAQUE BLOC
SI CONDITION REMPLIE ALORS SORT- DE-LA-SCENE
JUSQUA NOMBRE-DE-BLOCS

dans le 2d ET en algo
BLOCS-TESTES=0
POUR CHAQUE BLOC
SI CONDITION REMPLIE INCREMENTE BLOCS-TESTES
JUSQUA NOMBRE-DE-BLOCS
SI BLOCS-TESTES <> NOMBRE-DE-BLOCS ALORS SORT- DE-LA-SCENE

Pour tester j’ai posé la question à chatgpt
« écris moi avec les commentaires avec dans la seconde boucle la possibilité entre un traitement série ou parallèle selon un toggle qui s’appelle SceneSerieParallele dans l’UI le programme suivant » et j’ai mis le code du github
Gladys/server/lib/scene at master · GladysAssistant/Gladys · GitHub (du moins en cherchant le code du github il me semble que c’est là que cela se passe)

Il m’a retourné ça (merci chatgpt :slight_smile: ) je suis sur le cul ! :crazy_face:
Après pas sur que cela serait exploitable tel quel :thinking: :rofl: ni envisageable dans gladys (c’est vrai qu’il y a la structure de la base de données liée) mais ca me permet de découvrir et comprendre le code (pas ma tasse de thé ce langage :nauseated_face:) et ma foi voir ce qu’arrives à faire ChatGPT pour moi qui ai grandi en regardant la télé en noir et blanc et ou il fallait se lever le cul pour choisir entre la 1 et la 2 c’est bluffant même si cela faisait partie de mes rêves (« Planète interdite » !)

const Promise = require(‹ bluebird ›);
const { actionsFunc } = require(‹ ./scene.actions ›);
const { EVENTS, WEBSOCKET_MESSAGE_TYPES } = require(‹ …/…/utils/constants ›);
const { AbortScene } = require(‹ …/…/utils/coreErrors ›);
const logger = require(‹ …/…/utils/logger ›);

/**

  • @description Execute one action.
  • @param {object} self - Reference to the SceneManager.
  • @param {object} action - An Action from the db.
  • @param {object} scope - The scope passed to all actions.
  • @param {number} [columnIndex] - The X index of the action in the array of actions.
  • @param {number} [rowIndex] - The Y index of the action in the array of actions.
  • @returns {Promise} Resolve if the action was executed with success.
  • @example
  • executeAction(this, action, {});
    */
    async function executeAction(self, action, scope, columnIndex, rowIndex) {
    // Check if the action type is supported
    if (!actionsFunc[action.type]) {
    throw new Error(Action type "${action.type}" does not exist.);
    }

// Send a message to inform the UI that the action is being executed
if (columnIndex !== undefined && rowIndex !== undefined) {
self.event.emit(EVENTS.WEBSOCKET.SEND_ALL, {
type: WEBSOCKET_MESSAGE_TYPES.SCENE.EXECUTING_ACTION,
payload: { columnIndex, rowIndex },
});
}
try {
// Execute the action
await actionsFunc[action.type](self, action, scope, columnIndex, rowIndex);
} catch (e) {
if (e instanceof AbortScene) {
throw e;
} else {
logger.warn(e);
}
}

// Send a message to inform the UI that the action has finished being executed
if (columnIndex !== undefined && rowIndex !== undefined) {
self.event.emit(EVENTS.WEBSOCKET.SEND_ALL, {
type: WEBSOCKET_MESSAGE_TYPES.SCENE.FINISHED_EXECUTING_ACTION,
payload: { columnIndex, rowIndex },
});
}

return null;
}

/**

  • @description Execute an array of array of action.
  • @param {object} self - Reference to the SceneManager.
  • @param {object} actions - An array of array of actions from the db.
  • @param {object} scope - The scope passed to all actions.
  • @param {boolean} isParallel - Whether to execute actions in parallel or series based on the UI toggle.
  • @returns {Promise} Resolve if the action was executed with success.
  • @example
  • executeActions(this, actions, {}, true);
    */
    async function executeActions(self, actions, scope, isParallel = true) {
    // First level of the array should be executed in series
    await Promise.mapSeries(actions, async (parallelActions, columnIndex) => {
    // Then, the second level is executed based on the value of isParallel
    if (isParallel) {
    // Execute actions in parallel
    await Promise.map(parallelActions, async (action, rowIndex) => {
    await executeAction(self, action, scope, columnIndex, rowIndex);
    });
    } else {
    // Execute actions in series
    for (const [rowIndex, action] of parallelActions.entries()) {
    await executeAction(self, action, scope, columnIndex, rowIndex);
    }
    }
    });
    return null;
    }

module.exports = {
executeAction,
executeActions,
};

Un peu long mais si certains en lisant apprennent quelque chose de ce post tant mieux, c’est toujours çà de pris ! :slight_smile: