Lancer Script en fonction de l'heure ...

Lancer Script en fonction de l'heure ... - C - Programmation

Marsh Posté le 08-03-2011 à 19:50:15    

Bjr tout le monde, je commande des volets roulants via des relais qui sont eux même commandés par mon PC.
 
Le topo est simple, je souhaite mettre en place un petit prog qui à l'heure voulu (heure du levée et du coucher du soleil) lancera 2 scripts (1 scrit pour la montée le matin et un script pour la descente le soir).
 
Le problème c'est pour réaliser le programme. J'ai deja trouver du code en C qui calcule les heures de levée et de couché du soleil en fonction de la position géographique, Nikel ! Variables nomées "levee" et "couche" par exemple.
 
La chose qui reste a faire est qui me pose problème : Comparer l'heure du système et des variables "levee" et "couche", et quand ca colle, On lance un des 2 scripts.
 
Quel est le moyen d’après vous le plus intelligent pour y parvenir ? Comparer l'heure toute les minutes et donc 3600 fois par jour, sachant que seulement 2 fois ca va coller, c'est un peu dommage ..... ?


---------------
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !
Reply

Marsh Posté le 08-03-2011 à 19:50:15   

Reply

Marsh Posté le 08-03-2011 à 23:38:13    

Ce ne serait pas une meilleure idée de calculer le délai avant le prochain évènement et de faire une attente sur ce délai ? [:figti]


---------------
Doucement le matin, pas trop vite le soir.
Reply

Marsh Posté le 08-03-2011 à 23:45:17    

générer un job plannifé dans ton OS ce serait pas plus simple ? sous unix et windows il suffit de faire un "at"

Reply

Marsh Posté le 09-03-2011 à 00:05:18    

couak a écrit :

générer un job plannifé dans ton OS ce serait pas plus simple ? sous unix et windows il suffit de faire un "at"

Ah ben oui, tout simplement : une entrée dans la crontab la nuit qui programme les 2 exécutions de la journée via at :)


---------------
Doucement le matin, pas trop vite le soir.
Reply

Marsh Posté le 09-03-2011 à 09:15:09    

Ce n'est pas gênant d'avoir une tâche qui vérifie toutes les minutes ( résolution acceptable pour le sujet ) si elle a une tâche à faire ( baisser ou monter les volets ), puis de s'endormir pendant une minute. C'est d'ailleurs comme ça que doit être codé le démon cron.

Reply

Marsh Posté le 09-03-2011 à 15:19:12    

xilebo a écrit :

Ce n'est pas gênant d'avoir une tâche qui vérifie toutes les minutes ( résolution acceptable pour le sujet ) si elle a une tâche à faire ( baisser ou monter les volets ), puis de s'endormir pendant une minute. C'est d'ailleurs comme ça que doit être codé le démon cron.


 
Effectivement, ce n'est pas gênant quand un programme choisis cette solution,
seulement quand tous les programmes choisissent cette solution, l'ordi devient vite encombré de plein de logiciel au démarrage!
 
Dans ce cas, l'utilisation d'un planificateur de taches est plus propre! Par contre je ne sais pas s'il garantissent tous le respect du timing...
Ensuite il faut que l'ordinateur soit en marche, donc peut être faut il plus de réglage (réveil programmé de l'ordi?)...
 
à jbdivx de faire les choix...


---------------
Seul Google le sait...
Reply

Marsh Posté le 10-03-2011 à 11:53:44    

Merci de vos réponses. Je pense check l'heure toute les minutes, n'aynt pas trouver le moyen de connaitre le temps  entre 2 executions .^^


---------------
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !
Reply

Marsh Posté le 10-03-2011 à 14:07:00    

C'est pas très utile, ça.
Si une solution à la cron comme celles qui t'ont été proposées ne te conviennent pas (et il faudrait nous dire pourquoi), le solution la plus simple est d'opérer par dichotomie:
Tu regardes combien de temps il reste avant l'heure de lancement du processus d'ouverture/fermeture, et tu mets le processus de check en sommeil pour la moitié du temps restant (avec une granularité minimum de 1 mn ou moins, à toi de voir). Quand le temps restant est inférieur à la granularité (donc moins d'une minute si c'est ce que tu choisis), tu lances le processus d'ouverture/fermeture.
Ça a l'avantage de marcher même si on arrête le PC, si on relance automatiquement ce programme de check/lancement au redémarrage du PC.
Avec ce type de méthode, tu as au plus une douzaine de 12 checks pour un évènement par jour (12h/6h/3h/1h30/45mn/22mn/12mn/6mn/3mn/2mn/1mn/0mn) avec une granularité de 1mn (et 9 checks avec une granularité de 5mn, a mettre en relation avec les 167 checks si on fait ça régulièrement toutes les 5 mn).
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-03-2011 à 14:21:39    

gilou a écrit :

C'est pas très utile, ça.
Si une solution à la cron comme celles qui t'ont été proposées ne te conviennent pas (et il faudrait nous dire pourquoi), le solution la plus simple est d'opérer par dichotomie:
Tu regardes combien de temps il reste avant l'heure de lancement du processus d'ouverture/fermeture, et tu mets le processus de check en sommeil pour la moitié du temps restant (avec une granularité minimum de 1 mn ou moins, à toi de voir). Quand le temps restant est inférieur à la granularité (donc moins d'une minute si c'est ce que tu choisis), tu lances le processus d'ouverture/fermeture.
Ça a l'avantage de marcher même si on arrête le PC, si on relance automatiquement ce programme de check/lancement au redémarrage du PC.
Avec ce type de méthode, tu as au plus une douzaine de 12 checks pour un évènement par jour (12h/6h/3h/1h30/45mn/22mn/12mn/6mn/3mn/2mn/1mn/0mn) avec une granularité de 1mn (et 9 checks avec une granularité de 5mn, a mettre en relation avec les 167 checks si on fait ça régulièrement toutes les 5 mn).
A+,


 
 
je pense que cron ne convient pas car l'heure de lever et coucher est différente chaque jour. A moins qu'il soit possible de paramétrer cron pour qu'il puisse faire ça ( je ne connais pas bien cron ).

Reply

Marsh Posté le 10-03-2011 à 14:26:58    

Soit tu paramètres ton entrée dans la crontab pour qu'elle lance ton script toutes les minutes. Bof.
Soit tu utilises la crontab pour exécuter une fois ton script (très tôt le matin), celui-ci calcule les 2 heures qui t'intéressent et planifie les 2 exécutions via at.
 
at, c'est un peu comme cron mais pour programmer un seul évènement, et pas un évènement répétitif.
Chaque nuit, tu as donc les 2 exécutions de la journée qui sont planifiées :)

Message cité 1 fois
Message édité par mrbebert le 10-03-2011 à 14:27:36

---------------
Doucement le matin, pas trop vite le soir.
Reply

Marsh Posté le 10-03-2011 à 14:26:58   

Reply

Marsh Posté le 10-03-2011 à 14:32:41    

mrbebert a écrit :

Soit tu paramètres ton entrée dans la crontab pour qu'elle lance ton script toutes les minutes. Bof.
Soit tu utilises la crontab pour exécuter une fois ton script (très tôt le matin), celui-ci calcule les 2 heures qui t'intéressent et planifie les 2 exécutions via at.
 
at, c'est un peu comme cron mais pour programmer un seul évènement, et pas un évènement répétitif.
Chaque nuit, tu as donc les 2 exécutions de la journée qui sont planifiées :)


 
 
Merci de l'info :)

Reply

Marsh Posté le 10-03-2011 à 16:04:06    

xilebo a écrit :


 
 
Merci de l'info :)


relis le post, dans mon 1er message je parlais de "at" et pas de "cron"

Reply

Marsh Posté le 10-03-2011 à 20:10:23    

Merci pour vos rép.
 
gilou, tu m'a un peu perdu avec ton système, Ce que je me demande, c'est qu'a chaque fois que le PC redémarre (ou du moins, ce script) il faux recalculer et re-rentrer la valeur T/2 avec T qui est le délai du moment present et de la future montée-descente.
 
Aussi , et si je ne m'abuse , il faut un "script" pour la montée et un autre pour la descente.
 
Dans tous les cas, mes capacités de progs étant limités, je pense m'orientée vers un systeme de check toutes les minutes ou carrement, des programmes de domotique qui gere les heures de levée et de montée a ma place et ui lance automoatiquement le script "montée ou descente"
 
+


---------------
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !
Reply

Marsh Posté le 10-03-2011 à 21:50:44    

Question con, mais peux être t'y connais tu en électronique! Si c'est le cas, pourquoi ne pas mettre une commande via un capteur qui détecte la luminosité?


---------------
Seul Google le sait...
Reply

Marsh Posté le 10-03-2011 à 22:50:06    

jbdivx a écrit :

Merci pour vos rép.
 
gilou, tu m'a un peu perdu avec ton système, Ce que je me demande, c'est qu'a chaque fois que le PC redémarre (ou du moins, ce script) il faux recalculer et re-rentrer la valeur T/2 avec T qui est le délai du moment present et de la future montée-descente.
 
Aussi , et si je ne m'abuse , il faut un "script" pour la montée et un autre pour la descente.
 
Dans tous les cas, mes capacités de progs étant limités, je pense m'orientée vers un systeme de check toutes les minutes ou carrement, des programmes de domotique qui gere les heures de levée et de montée a ma place et ui lance automoatiquement le script "montée ou descente"
 
+

L'algo n'est pas très compliqué, c'est une boucle sur :
 
T=(heure futur évènement) - (heure actuelle)
si T > 5
  alors
    attente (T/2) # la commande sleep, en général
  sinon
    déclencher l'évènement
    attente 10 # pour être sur de ne pas le redéclencher si on repasse dans la boucle
fin_si
 
Mais je trouve que la solution avec cron et at est plus simple puisqu'elle te débarrasse de la gestion de la boucle infinie et des temps d'attente :)


---------------
Doucement le matin, pas trop vite le soir.
Reply

Marsh Posté le 11-03-2011 à 03:55:58    

jbdivx a écrit :

Merci pour vos rép.
 
gilou, tu m'a un peu perdu avec ton système, Ce que je me demande, c'est qu'a chaque fois que le PC redémarre (ou du moins, ce script) il faux recalculer et re-rentrer la valeur T/2 avec T qui est le délai du moment present et de la future montée-descente.


A chaque fois que tu sors de la veille, tu regardes la date et l'heure, tu fais la différence de l'heure avec l'heure d'activation des volets (calculée à la volée à partir de la date).
Si la différence est en dessous de la granularité, tu lances l'activation des volets, et tu te met en sommeil avec réveil à granularité + 1 mn, pour être sur qu'au réveil, tu auras dépassé l'heure de la précédente activation, et que tu entameras un cycle pour l'activation suivante.
Si la différence est au dessus de la granularité, tu divises par 2 cette différence, tu arrondis à la minute inférieure, et tu te met en sommeil avec réveil quand tu auras atteint cette valeur arrondie.
Chaque fois que le PC redémarre le script est lancé automatiquement, et il se comporte comme pour un réveil après mise en sommeil.
Bref, assez grossièrement, ça devrait avoir cette tête la:
 

Code :
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. #include <signal.h>
  6. #include <stdbool.h>
  7. #define GRANULARITY 60 /* 1 mn */
  8. /* calcul de l'heure d'activation qui suit rawtime
  9.    devrait toujours être supérieure ou égale à rawtime */
  10. void get_activation(struct tm rawtime, struct tm *activation);
  11. /* activation des volets */
  12. void perform_activation();
  13. static bool ended = false;
  14. /* arret manuel en envoyant SIGUSR1 */
  15. void user_exit(int sig) {
  16.   ended = true;
  17.   signal(SIGUSR1, SIG_DFL);
  18. }
  19. int main( int argc, char *argv[] ) {
  20.  
  21.   time_t rawtime, activation;
  22.   struct tm *ptm;
  23.   double delay;
  24.   int sleepduration = 0;
  25.   signal(SIGUSR1, user_exit);
  26.   while (!ended) {
  27.     time(&rawtime);
  28.     get_activation(rawtime, &activation);
  29.     delay = difftime(activation, rawtime);
  30.    
  31.     if (delay < 0) {
  32.       printf(stderr, "Exiting, Bad activation calculated\n" );
  33.       return EXIT_FAILURE;
  34.     }
  35.     else if (delay <= GRANULARITY) {
  36.       if (!ended) perform_activation();
  37.       sleepduration = GRANULARITY * 2;
  38.     }
  39.     else {
  40.       sleepduration = delay/2;
  41.     }
  42.     if (!ended) sleep(sleepduration);
  43.   }
  44.   return EXIT_SUCCESS;
  45. }


 
A+,


Message édité par gilou le 11-03-2011 à 09:14:55

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed