Création variable dans scripts

Bonjour,

Est-ce possible de créer des variable dans les script de gladys ?

je m’explique, par exemple je voudrais allumé une lampe pendant 6h après c’est 6h passé l’éteindre pendant 1h après 1h passé la rallumé, etc…

et pour démarré et arrêté cette boucle crée deux script ON OFF,
donc si l’état = ON, démarré la boucle et si l’état = OFF, arrêté la boucle,

Merci d’avance pour votre aide

Tu es sur Gladys 3 ou 4?
Pour Gladys 3, il y a plein de sujets qui traitent de ça avec la création de tâches cron dont un des derniers ou j’ai expliqué comment faire.
https://community-3.gladysassistant.com/t/resolu-creer-plage-horaire-prise-connectee/5110?u=tlse-vins
Pour Gladys 4 ce n’est pas encore codé.

Tu as aussi ce module si tu veux coder qui peut (peut être) t’aider :

Oui j’utilise gladys v3

je crois que je me suis mal expliqué,

par exemple faire un script qui va allumé la lampe pendant 6h après 6h l’éteindre, attendre 1h et la rallumé et sa indéfiniment, et pour démarré et arrêté ce script avoir deux script ON et OFF, lorsque j’exécute le script ON faire fonctionné ce script indéfiniment et avec le script OFF arrêté ce script

Effectivement tu veux une minuterie.
Ce que j’explique dans l’autre sujet c’est pour créer une alarme à une heure précise pour allumer ou pour éteindre.
Rapproche toi d’ @AlexTrovato pour en savoir plus.

Merci, je vais essayer sa !

Tu peux regarder du côté de la fonction setTimeout si tu veux implémenter toi même.


C’est ça derrière le module d’ @AlexTrovato.
Ce sera plus simple avec le module quand même;)

Salut @TheLogistics,
si j’ai bien compris, tu souhaites mettre en place un script pour :

  1. Allumer la lampe pendant 6h
  2. L’éteindre pendant 1h
  3. Recommencer

Et pouvoir arrêter / démarrer cette boucle avec un “actionneur” On/Off.

J’ai quelques questions (pour commencer) :

  1. La lampe est allumée de manière automatique, depuis 5h, et tu décides de passer l’actionneur en OFF. Que se passe-t-il ? La lampe devra s’éteindre dans 1 heure ou non ?
  2. Le script est à OFF, tu allumes la lumière manuellement (pendant 1h) et tu décides d’activer le script à ON. La lumière restera allumée 6h à compter de l’activation du script ?
  3. Le minuteur est en route, 3h sont déjà écoulées, tu éteins la lumière manuellement sans utiliser le script On/Off qui reste ON, que se passe-t-il ? La lumière devra s’allumer de nouveau dans 1h ?

Car le module gladys-timer à une limitation, il ne déclenche pas la minuterie si le device est déjà dans l’état attendu.

Ceci-dit, je pense qu’avec l’utilisation du gladys-fake-module de @MathieuA, il sera possible de détourner la situation.

Salut !,

oui c’est sa !

  1. Non la lampe s’éteint immédiatement
  2. oui la lumière restera allumée pendant 6h a l’activation du script
  3. oui la lumière doit s’allumer de nouveau dans 1h

Dans l’état actuel du module timer,
ton cas sera compliqué à gérer.

  • Le module permet d’allumer une lampe (un device) pendant un temps définit (6h),
  • puis à la fin de ces 6h il l’éteind
  • mais si la lampe est déjà allumée, le minuteur ne se déclenche pas
  • (et vice-versa)

Le problème dans ton cas :

  • J’allume la lampe pendant 6h (Lampe ON)
  • Puis au bout de ces 6h, j’éteinds la lampe (Lampe OFF)
  • Je pourrais penser lancer un script “inverse” qui éteint la lampe pendant 1h, puis l’allume, mais comme mon device est déjà OFF, le minuteur ne se déclenchera pas

C’est une des conditions que j’avais ajouté au module afin de ne pas trop surcharger la machine sur laquelle est hébergée Gladys.

Es-tu sûr de vouloir allumer de nouveau la lampe après 1h d’extinction ?

Il est possible de modifier le module, mais étant donné que je me concerne désormais sur la V4, je ne pourrais pas le tester et valider que la consommation de la machine reste raisonnable.

Ok, on va donc procéder en plusieurs étapes afin de bien découper et mieux comprendre le fonctionnement.


Prérequis

  1. Installer (ou mettre à jour) le module gladys-timer
  2. Installer le module gladys-fake-module
  3. Noter l’ID de la fonctionnalité On/Offde la lampe
    • Se rendre sur la page Périphériques
    • Onglet Mes périphériques
    • Cliquer sur Voir plus de la ligne correspondant à la lampe
    • Colonne ID (exemple idLampe = 9)

Création de l’actionneur Script On/Off

  1. Créer un nouveau péripérique manuellement depuis la page Périphériques
  2. Saisir fake-module dans le champ Service
  3. Pour les autres champs, tu es libre de mettre la valeur que tu veux
  4. Lui ajouter une Fonctionnalité en cliquant sur le bouton Voir plus, telle que :
    • Identifier : ce que tu veux
    • Type : binary
    • Min: 0
    • Max : 1
    • Capteur : Non
    • Afficher : Oui si tu souhaites le voir sur la page Périphériques
    • Pour les autres champs, tu es libre de mettre la valeur que tu veux
  5. Bien noter l’ID de cette fonctionnalité à peine créée (exemple idDeviceOnOff = 17)

A vérifier auprès de @MathieuA.


Création des minuteurs

Allumer pendant 6h (puis éteindre)

  1. Créer un script AllumerLampe
  2. Noter son ID (exemple idAllumerLampe = 1)
  3. Coller le code suivant en remplaçant avec les valeurs, les IDs préalablement relevés
// Ce script allume la lampe et l'éteind au bout de 6h
gladys.modules.timer.deviceTimer({
  // time, duration (millis)
  timeout: 21600000, // 6 h * 60 min * 60 sec * 1000 millis
  // device to activate timer
  provider: {
    deviceTypeId: 17, // remplacer par idDeviceOnOff (ID de l'activateur du script)
    activeValue: 1 // la valeur pour laquelle le script est actif
  },
  // device to manage
  consumer: {
    deviceTypeId: 9, // ID de la lampe a allumer/éteindre (idLampe)
    activeValue: 1, // switch light ON
    inactiveValue: 0, // switch light OFF
    checkDeviceState: false // ne verifie pas l'etat de la lampe
  }
});

Eteindre pendant 1h (puis allumer)

  1. Créer un script EteindreLampe
  2. Noter son ID (exemple idEteindreLampe = 2)
  3. Coller le code suivant en remplaçant avec les valeurs, les IDs préalablement relevés
// Ce script allume la lampe et l'éteind au bout de 6h
gladys.modules.timer.deviceTimer({
  // time, duration (millis)
  timeout: 3600000, // 1 h * 60 min * 60 sec * 1000 millis
  // device to activate timer
  provider: {
    deviceTypeId: 17, // remplacer par idDeviceOnOff (ID de l'activateur du script)
    activeValue: 1 // la valeur pour laquelle le script est actif
  },
  // device to manage
  consumer: {
    deviceTypeId: 9, // ID de la lampe a allumer/éteindre (idLampe)
    activeValue: 0, // switch light OFF
    inactiveValue: 1, // switch light ON
    checkDeviceState: false // ne verifie pas l'etat de la lampe
  }
});

Création des scénarios

Il faut maintenant créer deux scénarios :

  • un qui active le minuteur AllumerLampe lorsque la lampe s’allume
  • un qui active le minuteur EteindreLampe lorsque la lampe s’éteind

Pour cela, se rendre sur la page Scénarios, puis, puis chacun des scripts suivants, Nouveau (Editeur de texte), :

# Si la lampe s'allume, je declenche le minuteur 6h
trigger:
  title: AllumerLampe
  condition_template: devicetype == 9 && value == 1 # en remplacant devicetype par la valeur de idLampe
  active: 1
  code: devicetype-new-value
  user: 1
conditions: []
actions:
  - code: script.exec
    params:
      id: '1' # remplacer par la valeur idAllumerLampe
# Si la lampe s'éteind, je declenche le minuteur 1h
trigger:
  title: EteindreLampe
  condition_template: devicetype == 9 && value == 0 # en remplacant devicetype par la valeur de idLampe
  active: 1
  code: devicetype-new-value
  user: 1
conditions: []
actions:
  - code: script.exec
    params:
      id: '2' # remplacer par la valeur idEteindreLampe

Bouton d’activation du script

Au début, nous avons créé un périphérique virtuel avec le module fake-module (idDeviceOnOff = 17).
Il faut désormais lier son changement d’état à une action.

  1. Si l’état du péripherique est ON, activer le script AllumerLampe ou EteindreLampe selon l’état de la lampe.
  2. Si l’état du péripherique est OFF, arrêter tous les minuteurs sur cette lampe.

Pour cela, nous créerons un script pour déterminer si AllumerLampe ou EteindreLampe doit être démarré, et un script pour arrêter le minuteur.

Puis des scénarios qui lanceront ces scripts selon l’état du faux périphérique.

Script pour choisir quel minuteur démarrer

  1. Créer un script SelectMinuteur
  2. Noter son ID (exemple idSelectMinuteur = 10)
  3. Coller le code suivant en remplaçant avec les valeurs, les IDs préalablement relevés
// Ce script seelectionne le minuteur
// Verification de l'etat
gladys.deviceType.getById({ id: 9 }) # id de la lampe
  .then((deviceState) => {
    if (deviceState.lastValue) {
      // la lampe est allumée
      return gladys.script.exec({ id: 1 }); // on démarre le script AllumerLampe
    } else {
      // la lampe est éteinte
      return gladys.script.exec({ id: 2}); // on démarre le script EteindreLampe
    }
  });

Script pour arrêter le minuteur

  1. Créer un script StopMinuteur
  2. Noter son ID (exemple idStopMinuteur = 11)
  3. Coller le code suivant en remplaçant avec les valeurs, les IDs préalablement relevés
// Ce script annule les minuteurs
gladys.modules.timer.timerManager.unregisterTimer({
  // device to manage
  consumer: {
    deviceTypeId: 9, // ID de la lampe sur lequel un minuteur existe
  }
});

Création des scénarios

Pour cela, se rendre sur la page Scénarios, puis, puis chacun des scripts suivants, Nouveau (Editeur de texte), :

# Si le script est actif, je declenche un minuteur
trigger:
  title: ScriptOn
  condition_template: devicetype == 17 && value == 1 # en remplacant devicetype par la valeur de idDeviceOnOff
  active: 1
  code: devicetype-new-value
  user: 1
conditions: []
actions:
  - code: script.exec
    params:
      id: '10' # remplacer par la valeur idSelectMinuteur

# Si le script est inactif, j'arrete le minuteur
trigger:
  title: ScriptOff
  condition_template: devicetype == 17 && value == 0 # en remplacant devicetype par la valeur de idDeviceOnOff
  active: 1
  code: devicetype-new-value
  user: 1
conditions: []
actions:
  - code: script.exec
    params:
      id: '11' # remplacer par la valeur idStopMinuteur

Je pense n’avoir rien oublié, mais on n’est jamais à l’abri d’une faute de frappe ou autre erreur humaine.

@TheLogistics, j’attends ton retour pour savoir si tout roule.
Et n’oublie pas de remplacer les valeurs des périphériques et autres id par les vraies valeurs de ton environnement.

2 Likes

Salut !

Merci !! :slight_smile:
je vais mettre ça en place, et je te ferais un retour si tout fonctionne

Re,

j’ai tout configuré, tout fonctionne a merveille !! :slight_smile:
la lampe reste bien allumé pendant 6h, et se rallume après 1h

je te remercie ! :wink:

2 Likes