[c#] Scénario

Bonjour,

Je me demandais comment vous codiez les scénarios qui ont une heure fixe en c# ?

Par exemple, si je veux que Constellation m’envoie une notification tous les matins à 7h30 comment le gérer ? J’avais pensé à déduire l’heure du démarrage du package avec l’heure voulue mais j’ai pas réussi à faire quelque chose de fonctionnel.

Par extension, comment gérer si on veut une action tous les mardi ou tout les x du mois, etc…Sans empêcher les autres actions de se dérouler.

Tu peux utiliser des frameworks .NET comme Quartz (http://www.quartz-scheduler.net/features.html) spécialisé dans l’orchestration/planification de Job .NET !

Personnellement j’ai un truc plus light !

Tout d’abord j’ai une méthode type :

protected void AddBackgroundTask(Action action, int pauseBetweenAction = 1000, bool catchError = true)
{
    Task.Factory.StartNew(() =>
    {
        while (PackageHost.IsRunning)
        {
            try
            {
                action();
            }
            catch(Exception ex)
            {
                PackageHost.WriteError("Error on BackgroundTask: {0}", ex.ToString());
                if(!catchError)
                {
                    throw ex;
                }
            }
            Thread.Sleep(pauseBetweenAction);
        }
    });
}

Cela me permet de lui donner une action à exécuter toutes les x secondes (par défaut toute les secondes).

De ce fait dans mon code je peux créer une tache en background qui s’occupe de savoir si il est 7h30 passé pour “faire quelque chose” comme envoyer ta notification !

Le truc c’est ensuite d’enregistrer que tu as fait l’action, par exemple, en conservant la date courante dans une varaible de sorte à vérifier que ton “action” ne se produit qu’une fois par jour, heure, minutes, etc…

var notifiEnvoye = DateTime.MinValue;

this.AddBackgroundTask(() =>
{
	if(DateTime.Now.Date != notifiEnvoye.Date && DateTime.Now.Hour >= 7 && DateTime.Now.Minute >= 30)
	{
		// Envoyer la notification ici !
		notifiEnvoye = DateTime.Now;
	}
});

Donc en gros des boucles en background, qui loop en continue et check si les conditions sont satisfaites pour réaliser une action !

J’ai utilisé ta fonction et ça fonctionne top !

Merci je vais pouvoir migrer plus de scénario sur Constellation.

Si j’ai bien compris, pour les scénarios concernant le zwave tu les fais sur ta Vera directement ? C’est pour la simplicité et pour qu’en qu’à de problèmes tes scénarios zwave soient toujours accessibles ? (à part si c’est la Vera qui tombe en rade bien sûr)

Hello,

Tous mes scénarios sont déclenchés par Constellation.

Sur Vera, ce que je fais c’est des scénarios manuels comme “Fermer toutes les lumières du RDV”. Un scénario sans déclencheurs qui s’occupe de mettre OFF sur les bonnes lumières Z-WAve.
De ce fait en C# dans mon package Constellation, je n’ai plus qu’à invoquer ce scénario en une ligne de code! Constellation se charge ensuite du reste (par exemple lumière Hue & co…)

Mais toute l’orchestration (les règles) est bien côté Constellation :slight_smile: