IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Problème de comparaison


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2017
    Messages : 7
    Points : 1
    Points
    1
    Par défaut Problème de comparaison
    Bonsoir à tous,

    Alors voilà, je suis en Terminale STI2D SIN et j'ai en projet de commander un portail automatique selon des horaires définis à partir d'un site web (jusque là aucun soucis). J'utilise une base de donnée MySQL pour les horaires, ainsi je peux facilement marier site et script Python géré par un Raspberry PI 3.

    En attendant la livraison du moteur, je simule l'ouverture et la fermeture avec des LED rouge (portail fermée) et verte (ouvert). Je compare donc les horaires de la base de donnée par rapport à l'heure actuelle. Tout fonctionne concernant l'heure d'ouverture. Si l'heure récupérée est inférieur à l'heure actuelle, LED rouge et inversement.

    Néanmoins j'ai une double comparaison mais elle ne s'effectue pas. J'ai comme l'impression que le script ne prend en compte que l'heure d'ouverture et pas de fermeture, comment résoudre ce soucis ?


    Désolé si mes explications ne sont pas claires mais je vous laisse en dessous une photo de ma DB sur PHPmyAdmin ainsi que mon script.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    import RPi.GPIO as GPIO
    from twilio.rest import TwilioRestClient
    import time
    import datetime
    import threading
    import MySQLdb
     
     
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(40, GPIO.OUT)
    GPIO.setup(38, GPIO.OUT)
     
    db = MySQLdb.connect(host="localhost",    # your host, usually localhost
                        user="root",         # your username
                       passwd="Orel_27130",  # your password
                        db="projet")        # name of the data base
     
     
     
     
    day = datetime.datetime.now()
    day = day.isoweekday()
     
     
    if day == 3 :
        while day == 3:
            # calcul du time delta + affichage de l'heure actuelle au format H24
            midnight = datetime.datetime.combine(datetime.date.today(), datetime.time.min)
            now_relative = datetime.datetime.now() - midnight
            print time.strftime("%H:%M:%S")
     
            # Requete SQL
            cursor1 = db.cursor()
            cursor1.execute("SELECT time_open FROM time WHERE id = 3")
            time_open = cursor1.fetchone()
            cursor2 = db.cursor()
            cursor2.execute("SELECT time_close FROM time WHERE id = 3")
            time_close = cursor2.fetchone()
     
     
            # Si Time open est superieur ou egale a l'heure actuelle et si time close est inferieur a l'heure actuelle
            if(time_open[0] >= now_relative and time_close[0] < now_relative):
                print ("Fermee")
                GPIO.output(38, False)
                GPIO.output(40, True)   
            else:
                print ("Ouvert")
                GPIO.output(38, True)
                GPIO.output(40, False)
    Nom : XjYiS.png
Affichages : 124
Taille : 51,3 Ko

    Merci d'avance,
    iDezwin

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Vous pensez bien qu'un test du genre if a > 0 and b < 0 fonctionne... Sinon çà se saurait et Python n'aurait pas un tel succès.
    Donc si çà fonctionne "en général" mais pas dans votre cas c'est peut être que vous comparez des patates avec des oranges... J'en sais rien mais "print" des différentes variables, print (type(...)) des différentes variables, ... est un bon début pour s'assurer qu'on compare bien des choses comparables.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2017
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Salut,
    Merci de la réponse rapide.
    Donc il faudrait que je convertisse tout en seconde ?

    iDezwin

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par iDezwin Voir le message
    Donc il faudrait que je convertisse tout en seconde ?
    Faut-il tout convertir en secondes ou transformer en datetime la chose retournée par le SGDB? Tant que vous ne vérifiez pas ce que la requête SQL vous retourne vous ne connaissez pas encore le problème et envisager une solution sera prématuré.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Affiche Time_open[0], time_close[0] et now_relative.

    Peux-tu nous donner ces 2 valeurs Time_open[0] et time_close[0].
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2017
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Salut,

    Voici les print de toutes les valeurs :

    1ere ligne = time_open[0]
    2eme ligne = time_close[0]
    3eme ligne = now_relative

    Nom : print all.png
Affichages : 121
Taille : 529 octets

    Edit : Time_open[0] et time_close[0] correspondent bien aux valeurs de la database

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par iDezwin Voir le message
    Salut,

    Voici les print de toutes les valeurs :

    1ere ligne = time_open[0]
    2eme ligne = time_close[0]
    3eme ligne = now_relative

    Nom : print all.png
Affichages : 121
Taille : 529 octets

    Edit : Time_open[0] et time_close[0] correspondent bien aux valeurs de la database
    Super!
    Il eut été souhaitable d'afficher le type de vos données... mais bon on supposera que Python sait attraper l'erreur si on à un problème de ce côté là.
    Donc la question est de savoir dans quel cas, la condition (time_open[0] >= now_relative and time_close[0] < now_relative) est vraie.
    En supposant que time_open[0] < time_close[0], c'est plutôt l'ensemble vide.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2017
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Super!
    Il eut été souhaitable d'afficher le type de vos données... mais bon on supposera que Python sait attraper l'erreur si on à un problème de ce côté là.
    Donc la question est de savoir dans quel cas, la condition (time_open[0] >= now_relative and time_close[0] < now_relative) est vraie.
    En supposant que time_open[0] < time_close[0], c'est plutôt l'ensemble vide.

    - W
    Je suis désolé, mais je débute et j'ai pas compris ton indication

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par iDezwin Voir le message
    Je suis désolé, mais je débute et j'ai pas compris ton indication
    Il n'y a rien à comprendre.
    Vous lancer la console Python.
    Vous définissez un intervalle [a..b]
    Vous regardez les "c" dans 0..23 qui vérifient votre condition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> for c in range(24):
    ...     if a >= c and b < c:
    ...        print (c)
    ...
    Oh...surprise, il n'y en a pas.
    Est-ce que c'est le résultat que vous attendiez?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2017
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Rien ne s'affiche en effet; mais je vois pas le rapport avec mon projet

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par iDezwin Voir le message
    Rien ne s'affiche en effet; mais je vois pas le rapport avec mon projet
    La condition qui est testée est identique.
    La seule différence est qu'on compare des entiers à la place d'heures.

    Donc la question est "pourquoi tester une condition qui sera toujours fausse?"

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Dans ton code, tu dis : S'il est plus de 18heure et moins de 13heure, alors faire telle action.
    Tu vois bien qu'à aucun moment de la journée, ces 2 conditions ne sont vérifiées en même temps.

    Ton code marcherait si on avait par exemple time_close = 10h et time_open = 11h. Dans ce cas, Entre 10h et 11h, on aurait bien l'action voulue.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  13. #13
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2017
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Dans ton code, tu dis : S'il est plus de 18heure et moins de 13heure, alors faire telle action.
    Tu vois bien qu'à aucun moment de la journée, ces 2 conditions ne sont vérifiées en même temps.

    Ton code marcherait si on avait par exemple time_close = 10h et time_open = 11h. Dans ce cas, Entre 10h et 11h, on aurait bien l'action voulue.

    Ha d'accord, je crois que j'ai compris mon erreur, donc vu que les horaires peuvent être variables, il faudrait mettre
    Si time_open[0] = now_relative, on passe une variable à 1 tant que time_close n'a pas été dépassé ?

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par iDezwin Voir le message
    Ha d'accord, je crois que j'ai compris mon erreur, donc vu que les horaires peuvent être variables, il faudrait mettre
    Si time_open[0] = now_relative, on passe une variable à 1 tant que time_close n'a pas été dépassé ?
    Il faudrait surtout savoir ce que représentent "time_open" et "time_close" notamment si l'intervalle de temps vérifiera toujours time_open < time_close. Car, on peut très bien imaginer démarrer un truc à 22h et le terminer à 4h. Et çà c'est un problème de conception et non de programmation.
    Côté programmation, le fait est que (time_open[0] >= now_relative and time_close[0] < now_relative) est difficile à comprendre.
    Si vous voulez tester qu'on est dans l'intervalle (ou pas) time_open[0] <= now_relative < time_close[0] est quand même plus lisible (lorsque time_open[0] < time_close[0]).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  15. #15
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Tu ne peux pas tester si Time_now = Time_open ni si Time_now = Time_Close.
    Tu peux le faire... Python va faire le test correctement, ce n'est pas le problème, mais pour que ça marche, il va falloir appeler cette procédure très souvent... Tous les millièmes de secondes. Si par malheur, tu appelles cette procédure à 10h59, puis à 11h01, et qu'il y avait une instruction " à 11h00, fermer la barrière", alors ta barrière va rester ouverte à tort, éventuellement plusieurs heures.

    Ce que tu peux faire, c'est :
    - Il est 15h30 ( Time_now = ... )
    - Lire la ligne la plus grande, mais avec heure inférieure à 15h30. Si cette ligne est une ligne 'Ouvrir la barrière', alors tu t'assures que la barrière est ouverte, et si cette ligne est une ligne 'Fermer la barrière' alors tu t'assures que la barrière est fermée.
    Et 3ème cas, si il n'y a pas de ligne avec heure inférieure à 15h30, dans ce cas, tu lis la dernière ligne, toute heure confondue. C'est le cas évoqué par Wiztricks, il est 4h du mat, et la dernière ligne est : "à 22h, fermer la barrière".

    Avec cette organisation, tu peux même avoir autant de plages Ouvert/fermé que tu veux dans une journée.

    Voilà. La partie conception est finie, tu peux commencer la programmation.
    Ahhh pas de chance, tu avais voulu faire la programmation avant la conception ?

    PS : La description de table que tu mettais dans ton 1er post serait donc à revoir.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  16. #16
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2017
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Ahhh pas de chance, tu avais voulu faire la programmation avant la conception ?
    Exactement, on va dire que c'est mon premier vrai projet en total autonomie donc c'est en faisant des conneries qu'on apprend

    Merci en tout cas je vais essayer de faire comme ça, maintenant que j'ai compris mes erreurs

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/03/2006, 12h39
  2. Réponses: 11
    Dernier message: 22/03/2006, 21h57
  3. problème de comparaison table dans requète.
    Par Sendo dans le forum Access
    Réponses: 8
    Dernier message: 09/03/2006, 11h10
  4. Problème de comparaison (chez lycos)
    Par Tuscelan dans le forum Langage
    Réponses: 4
    Dernier message: 10/11/2005, 18h13
  5. Problème de comparaison de dates
    Par MiJack dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/03/2004, 21h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo