Voilà mon dilemme et j'aimerai vos avis :
Je dois gérer des actions identiques, programmées à des heures et dates données, et répétées tous les jours/semaines/mois.
Je dois pouvoir en faire de 1 par mois à plusieurs par jour...
Je pensais prendre un shield RTC; et gérer avec des tests de date... mais cela me semble être une usine à gaz (4 moteurs à piloter pour débuter et pour chaque moteur plusieurs moments possible d'action). J'ai découvert aujourd'hui la librairie ScheduleTable...
Quels sont les avantages et les inconvénients des 2 solutions ?
Quelle solution prendriez-vous et pourquoi ?
Cette librairie ne gère pas les échéances à partir de date mais comme des offset de temps par rapport à un T0 qui est la mise sous tension (utilisation de millis() comme base de temps).
Donc tu ne peux pas gérer des opération sur de très longues périodes de temps (supérieure à la période de millis() soit environ 49 jours).
Si le système redémarre ton T0 va changer et donc tous tes événements seront décalés par rapport au temps "absolu".
Cette librairie fonctionnera bien si tu veux faire une action toutes les 5 heures une autre toutes les 25 secondes et ainsi de suite. Par contre impossible de faire une action tous les jeudis de 5h à 6h30.
Je suis en train de terminer une lib qui fait justement ça, mais avec une vision hebdomadaire. c'est à dire qu'on définit une tache en lui donnant:
Le jour de la semaine du déclenchement
L'heure (heure et minute) du déclenchement
L'action a effectuer (par exemple powerOn ou powerOff) et ceci grace à des fonctions que callback que tu définis dans ton code et que la lib va appeler au moment voulu. Du coup, tu exécutes ce que tu veux
Tu pourrais facilement l'adapter pour avoir une programmation basée sur le jour du mois au lieu du jour de la semaine....
Le principe est que tu passes un pointeur vers une fonction
Ce pointeur, tu peux le stocker dans une variable comme n'importe quel pointeur.
Du coup, dans ton code, tu fais tes propres fonctions (par exemple pour allumer tel moteur, faire tel calcul etc etc) et tu donnes à la tache planifiée le pointeur de ta fonction personnelle
Quand arrive le moment, la tache se déclenche et appelle TA fonction
Ca permet de rendre la lib de gestion des taches complètement flexible car tu lui demandes de lancer tes propres actions sans toucher à la lib elle meme
Non, je n'avais pas prévu de la diffuser et je suis en train de la finir pour mon propre usage. Je n'ai donc pas de page ou prévu de présenter mon travail. C'est en voyant ta demande que j'ai réagi
wAx:
Le principe est que tu passes un pointeur vers une fonction
Ce pointeur, tu peux le stocker dans une variable comme n'importe quel pointeur.
Du coup, dans ton code, tu fais tes propres fonctions (par exemple pour allumer tel moteur, faire tel calcul etc etc) et tu donnes à la tache planifiée le pointeur de ta fonction personnelle
Quand arrive le moment, la tache se déclenche et appelle TA fonction
Ca permet de rendre la lib de gestion des taches complètement flexible car tu lui demandes de lancer tes propres actions sans toucher à la lib elle meme
Non, je n'avais pas prévu de la diffuser et je suis en train de la finir pour mon propre usage. Je n'ai donc pas de page ou prévu de présenter mon travail. C'est en voyant ta demande que j'ai réagi
Ok, merci pour ces précisions !
Tant qu'on y est... je vois souvent backend ou un truc du genre... si tu as une petite explication aussi clair, ça serait génial !
Sinon pour ta lib, c'est pas grave, je pensais partir sur un petit tableau qui contient la prochaine date d’événement et de faire tourner le tableau au fur et à mesure des actions faites...
Ex :
tab_event [[25/10/16 9h00] /action journalière/[28/10/16 9h05] /action hebdomadaire/]
Quand l'action du 25/10/16 9h00 a été faite, je replace la date suivante 26/10/16 9h00 dans le tableau à l'aide d'une fonction de tri (limité puisque le nombre de programmation sera limité).
Ce qui donnerait :
tab_event [[26/10/16 9h00]/action journalière/[28/10/16 9h05]/action hebdomadaire/]
etc...
Puis le 28/10/16 après exécution des 2 programmations, on aurait alors :
tab_event[[29/10/16 9h00]/action journalière/[04/11/16 9h05]/action hebdomadaire/]
Je pense que c'est pas trop lourd et pas trop déconnant vu que je connais la périodicité de chaque événement.
J'ai une classe Task qui contient une heure, un jour de la semaine et une action
J'ai ensuite une liste chainée de pointeurs vers les instances de Task plus un pointeur vers la prochaine Task à exécuter. Cette liste est automatiquement gérée par un manager
J'ai aussi un garde fou qui log quand chaque Task a été exécutée pour la derniere fois, pour ne pas la ré-exécuter en boucle pendant une minute (cas où il n'y en a qu'une dans la liste)
J'ai des méthodes qui ajoutent des taches au manager (ce dernier renvoie alors un id) ou de supprimer des taches de la liste à partir de l'id
C'est l'ajout et la suppression qui garantissent que la liste est toujours bien ordonnée
Dès qu'une tache est ajoutée ou supprimée, le manager recalcule quelle est la prochaine tache à venir
Je peux te passer en privé toutes les classes et le code, mais c'est fourni tel quel, je suis toujours en phase de tests pour recetter le tout
Ce que je ne t'ai pas précisé, c'est qu'à terme, il y aura une IHM pour ajouter/supprimer des taches, consulter celles existantes etc etc
C'est pour cela que j'ai ces méthodes d'accès dont l'ajout qui renvoie un ID pour pouvoir lancer un delete si on veut plus tard
Il y aura donc (mais pas encore fait) une méthode donnant la liste des taches existantes et la possibilité d'avoir le détail
Mon projet global de domotique consiste à mettre des Arduino sur chaque appareil controlable (moteur, chauffage, arrosage etc etc) et d'avoir rPi qui puisse tous les interroger sur un lan dédié soit pour connaitre les différents états, soit pour donner des ordres ou changer la programmation.
Le rPi sera quant à lui dans le lan de la maison en plus du lan dédié et présentera une interface web. Il servira donc de passerelle pour piloter toute la maison à partir d'un tel, tablette, pc qu'il soit interne ou qu'on soit à distance à travers le web