Go Down

Topic: Gmail notifier sans Ethernet Shield (Read 5116 times) previous topic - next topic

chicotore

Quote
2. C'est exactement ce que fait mon programme, dans le tiens il te manque une boucle infinie avec un sleep (une sorte de "delay" comme sur l'Arduino).


C'est pour le fait qu'il check les mails en permanence ou pour faire clignoter la led constamment ?

J'ai essayer ça, pas d'erreur mais en fait il n'y a pas de "bouclage" du programme ...

Quote
import serial, sys, feedparser, time
#Settings - Change these to match your account details
USERNAME="xxxxx@gmail.com"
PASSWORD="xxxxxxx"
PROTO="https://"
SERVER="mail.google.com"
PATH="/gmail/feed/atom"
SERIALPORT = "COM3" # Change this to your serial port!
# Set up serial port
try:
   ser = serial.Serial("COM3", 9600)
except serial.SerialException:
   print "no device connected - exiting"
   sys.exit()

newmails = int(feedparser.parse(PROTO + USERNAME + ":" + PASSWORD + "@" + SERVER + PATH)["feed"]["fullcount"])
   
# Output data to serial port
if newmails > 0:
   ser.write("m")
   print "some mail"
else:
   ser.write("n")
   print "no mail"
#print data to terminal


# Close serial port
time.sleep(0.5)


PS: j'ai réussit a lancer ce script dans l'exécuteur Windows en faisant : c:/python27/checkmail.py

merci
Mon Blog sur l'environnement Arduino ... Tutos fait par un débutant pour les débutants ^^

http://chicowebsite.free.fr/

Darel

J'ai repris ta méthode avec feedparser et voilà un script fonctionnel :
Code: [Select]
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import feedparser
import serial
import time

# ------------------------------------------------------------------------------ #

request = 'https://user:password@mail.google.com/gmail/feed/atom'
serial = 'COM3'
delay = 2

# ------------------------------------------------------------------------------ #

def check_gmail (request):
try:
newmails = int(feedparser.parse(request)['feed']['fullcount'])
except:
return 'ERROR'
else:
return newmails

# ------------------------------------------------------------------------------ #

try:
ser = serial.Serial(serial, 9600)
except:
print 'No device connected !'
else:
while True:
reply = check_gmail(request)
if reply == 'ERROR':
ser.write(-1)
print reply
else:
if reply > 0:
   ser.write(1)
else:
   ser.write(0)
print str(reply) + ' new mail(s) !'
time.sleep(delay)


Chez moi tout marche bien.
Sur mon circuit j'ai une LED verte, et une rouge (pour la gestion des erreurs).

Si l'Arduino reçoit 1, j'allume la LED verte et j’éteins la LED rouge (email(s) non lu(s)).
Si l'Arduino reçoit 0, j'éteins la LED verte et j’éteins LED la rouge (pas email(s) non lu(s)).
Si l'Arduino reçoit -1, j'éteins la LED verte et j'allume LED la rouge (erreur, qui peut être de connexion à Internet ou login invalide).

Petite remarque : j'ai allongé la pause (sleep) dans la boucle, si ça tourne trop vite, tu risques de faire ramer l'ordi et ta connexion Internet, sachant que même un check toute les 5 secondes ça suffit amplement pour être avertis rapidement (même si avec les ordi de nos jours, il en faut pas mal pour leurs faire mal :P).

Enjoy it :) !

chicotore

Merci a toi mais avec python je commence a craquer  ]:D

J'ai donc repris ton code et j'ai compris son cheminement
Quote
import feedparser
import serial
import time

# ------------------------------------------------------------------------------ #

request = "https://xxxx:xxxxx@mail.google.com/gmail/feed/atom"
serial = "COM3"
delay = 2

# ------------------------------------------------------------------------------ #

def check_gmail (request):
   try:
      newmails = int(feedparser.parse(request)['feed']['fullcount'])
   except:
      return 'ERROR'
   else:
      return newmails

# ------------------------------------------------------------------------------ #

try:
   ser = serial.Serial("COM3", 9600)
except:
   print 'No device connected !'
else:
   while True:
      reply = check_gmail(request)
      if reply == 'ERROR':
         ser.write(-1)
         print reply
      else:
         if reply > 0:
            ser.write("m")
         else:
            ser.write("n")
         print str(reply) + ' new mail(s) !'
      time.sleep(delay)


et je me retrouve avec l'erreur 'No device connected !'

Je me dit que c'est peut être mon arduino qui merdouille alors je lance "mon" code:

Quote
import feedparser
import serial
import time
#Settings - Change these to match your account details
USERNAME="xxxx@gmail.com"
PASSWORD="xxxxxx"
PROTO="https://"
SERVER="mail.google.com"
PATH="/gmail/feed/atom"
SERIALPORT = "COM3"
delay = "2"
# Change this to your serial port!
# Set up serial port
try:
   ser = serial.Serial("COM3", 9600)
except serial.SerialException:
   print "no device connected - exiting"
   sys.exit()

newmails = int(feedparser.parse(PROTO + USERNAME + ":" + PASSWORD + "@" + SERVER + PATH)["feed"]["fullcount"])
   
# Output data to serial port
if newmails > 0:
   ser.write("m")
   print "some mail"
else:
   ser.write("n")
   print "no mail"
#print data to terminal


# Close serial port
time.sleep(delay)


Et la pas de souci le check des mails se lance mais je pense que mon delay ne fonctionne pas car je n'est qu'un seul "no email" et pas de nouvelle ligne toutes les 2 secondes ....

merci beaucoup


Mon Blog sur l'environnement Arduino ... Tutos fait par un débutant pour les débutants ^^

http://chicowebsite.free.fr/

Darel

Et si tu transforme ça :
Code: [Select]
try:
        ser = serial.Serial("COM3", 9600)
except:
        print 'No device connected !'

En :
Code: [Select]
try:
        ser = serial.Serial("COM3", 9600)
except serial.SerialException:
        print 'No device connected !'


Et dans le tiens c'est tout à fais normal que ça ne check qu'une seule fois.
Je te l'ai déjà dis, tu n'as pas de boucle, donc une fois le programme finit, il quitte.

C'est pour ça que dans le miens il y a :
Code: [Select]
while True:

C'est un boucle infinie.
L'équivalent en langage C (pour l'Arduino) :
Code: [Select]
while (true)

Donc dans mon programme, le cheminement est :
Quote
check des emails

si ERROR --> -1
sinon
        si nombre > 0 --> 1
        sinon --> 0

petit "dodo" du programme pendant n secondes...
Et HOP ! On remonte à la première étape !


Donc voilà...

chicotore

#19
Mar 06, 2011, 05:08 pm Last Edit: Mar 06, 2011, 05:21 pm by chicotore Reason: 1
Quote
Traceback (most recent call last):
 File "C:\Python27\checkgmail.py", line 25, in <module>
   except serial.SerialException:
AttributeError: 'str' object has no attribute 'SerialException'


En remplaçant voila la nouvelle erreur .... Je pige vraiment pas alors que cette partie du code est identique sur les 2 et que un fonctionne et pas l'autre ...

merci beaucoup

EDIT:

OK je commence a comprendre la "boucle", j'ai donc rajouter le else et while true dans mon code mais ça coince encore grrrr
Quote
import feedparser
import serial
import time
#Settings - Change these to match your account details
USERNAME="xxxxxx@gmail.com"
PASSWORD="xxxxxxxx"
PROTO="https://"
SERVER="mail.google.com"
PATH="/gmail/feed/atom"
SERIALPORT = "COM3"
delay = 2

# Change this to your serial port!
# Set up serial port
try:
   ser = serial.Serial("COM3", 9600)
except serial.SerialException:
   print "no device connected - exiting"
   sys.exit()

newmails = int(feedparser.parse(PROTO + USERNAME + ":" + PASSWORD + "@" + SERVER + PATH)["feed"]["fullcount"])
   
# Output data to serial port
else:
   while True:

if newmails > 0:
   ser.write("m")
   print "some mail"
else:
   ser.write("n")
   print "no mail"
#print data to terminal


# Close serial port
time.sleep(delay)

Mon Blog sur l'environnement Arduino ... Tutos fait par un débutant pour les débutants ^^

http://chicowebsite.free.fr/

Darel

C'est moi qui ai fais une bétise :P !
Il y avait un conflit de nom entre le module "serial" et la variable "serial" que j'avais mis au début.

Voilà le code corrigé :
Code: [Select]
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import feedparser
import serial
import time

# ------------------------------------------------------------------------------ #

request = 'https://user:password@mail.google.com/gmail/feed/atom'
serial_port = 'COM3'
delay = 2

# ------------------------------------------------------------------------------ #

def check_gmail (request):
try:
newmails = int(feedparser.parse(request)['feed']['fullcount'])
except:
return 'ERROR'
else:
return newmails

# ------------------------------------------------------------------------------ #

try:
ser = serial.Serial(serial_port, 9600)
except serial.SerialException:
print 'No device connected !'
else:
while True:
reply = check_gmail(request)
if reply == 'ERROR':
ser.write(-1)
print reply
else:
if reply > 0:
   ser.write(1)
else:
   ser.write(0)
print str(reply) + ' new mail(s) !'
time.sleep(delay)


J'ai changé la variable "serial" en "serial_port".

chicotore

Ah bah nikel celui la fonctionne  :), je m'en vais l'éplucher pour mieux comprendre ce que j'avais zaper ....

Bon maintenant il me reste a faire la partie "arduino"  :D

franchement merci beaucoup pour ton aide  :smiley-mr-green:
Mon Blog sur l'environnement Arduino ... Tutos fait par un débutant pour les débutants ^^

http://chicowebsite.free.fr/

Darel

Pas de quoi.

Pour la partie Arduino tu peux le faire avec une seule LED sinon.
1 --> LED allumée.
0 --> LED éteinte.
-1 --> LED qui clignote.

Enjoy it !

chicotore

Je suis parti sur ce concept en fait:

No mail => LED éteinte  ( variable "n" )
Mails => LED clignotante ( variable "m" )
ERROR => LED fixe (variable "-1" )

J'ai déjà fait "la base" il me reste a implanter le clignotement, j'attaque ça de suite


Quote
// led wired + to pin 12, resistor to positive +5v

int outPin = 13; // Output connected to digital pin 12
int mail = LOW; // Is there new mail?
int val; // Value read from the serial port
void setup()
{
pinMode(outPin, OUTPUT); // sets the digital pin as output
Serial.begin(9600);
Serial.flush();
mail = LOW; // start off with lights out
}

void loop()
{
// Read from serial port
if (Serial.available())
{
   val = Serial.read();
   Serial.println(val, BYTE);

   if (val == 110) // n = 110 in dec
   {
     mail = LOW;  // HIGH is off because led is connected to +5v on the other side
   }
   if (val == -1) // n = 110 in dec
   {
     mail = LOW;  // HIGH is off because led is connected to +5v on the other side
   }

   else if (val == 109) //109 = m in dec
   {
     mail = HIGH; // LOW is on because led is connected to +5v on the other side
   }
}

// Set the status of the output pin
digitalWrite(outPin, mail);
}

Mon Blog sur l'environnement Arduino ... Tutos fait par un débutant pour les débutants ^^

http://chicowebsite.free.fr/

chicotore

Partie "clignotante" implémenté mais ça clignote pas outchhh ^^


Quote
// led wired + to pin 12, resistor to positive +5v

int outPin = 13; // Output connected to digital pin 12
int mail = LOW; // Is there new mail?
int val; // Value read from the serial port
void setup()
{
pinMode(outPin, OUTPUT); // sets the digital pin as output
Serial.begin(9600);
Serial.flush();
mail = LOW; // start off with lights out
}

void loop()
{
// Read from serial port
if (Serial.available())
{
   val = Serial.read();
   Serial.println(val, BYTE);

   if (val == 110) // n = 110 in dec
   {
     mail = LOW;  // HIGH is off because led is connected to +5v on the other side
   }
   if (val == -1) // n = 110 in dec
   {
       mail = HIGH;  // HIGH is off because led is connected to +5v on the other side
   }

   else if (val == 109) //109 = m in dec
   {
      mail = LOW; // LOW is on because led is connected to +5v on the other side
     delay(1000);
     mail = HIGH; // LOW is on because led is connected to +5v on the other side
     delay(1000);
   }
}

// Set the status of the output pin
digitalWrite(outPin, mail);
}
Mon Blog sur l'environnement Arduino ... Tutos fait par un débutant pour les débutants ^^

http://chicowebsite.free.fr/

chicotore

Arff j'ai besoin de vous  :smiley-roll:, ma LED ne veut pas clignoter j'ai beau chercher je vois pas !
Elle reste fixe au lieu de clignoter pourtant j'ai bien mis un "delay" d'allumage et d'extinction  :smiley-red:
Quote
// led wired + to pin 12, resistor to positive +5v

int outPin = 13; // Output connected to digital pin 12
int mail = LOW; // Is there new mail?
int val; // Value read from the serial port
void setup()
{
pinMode(outPin, OUTPUT); // sets the digital pin as output
Serial.begin(9600);
Serial.flush();
mail = LOW; // start off with lights out
}

void loop()
{
// Read from serial port
if (Serial.available())
{
   val = Serial.read();
   Serial.println(val, BYTE);

   if (val == 110) // n = 110 in dec
   {
     mail = LOW;  // HIGH is off because led is connected to +5v on the other side
   }
   if (val == -1) // n = 110 in dec
   {
       mail = HIGH;  // HIGH is off because led is connected to +5v on the other side
   }

   else if (val == 109) //109 = m in dec
   {
      mail = LOW; // LOW is on because led is connected to +5v on the other side
     delay(1000);
     mail = HIGH; // LOW is on because led is connected to +5v on the other side
     delay(1000);

   }
}

// Set the status of the output pin
digitalWrite(outPin, mail);
}


merci a vous
Mon Blog sur l'environnement Arduino ... Tutos fait par un débutant pour les débutants ^^

http://chicowebsite.free.fr/

Darel

C'est normal que ça ne marche pas...

Quand tu fais :
Code: [Select]
mail = LOW; // LOW is on because led is connected to +5v on the other side
delay(1000);
mail = HIGH; // LOW is on because led is connected to +5v on the other side
delay(1000);


Ce qui se traduit par :
Quote
Changement de la variable mail à LOW...
Attente de 1 seconde...
Changement de la variable mail à HIGH...
Attente de 1 seconde...

Changement du statut de la LED avec la valeur de la variable mail.

En gros ta valeur n'a pas changé quand tu arrive à la modification du statut de la LED.

Dans ton cas, je ne ferais pas clignoter cette LED, c'est plus compliqué.
Voilà ma version avec 3 LED (verte, rouge et bleu) :
Code: [Select]
int verte = 11;
int rouge = 12;
int blanche = 13;

int value = 0;

void setup()
{
  pinMode(verte, OUTPUT);
  pinMode(rouge, OUTPUT);
  pinMode(blanche, OUTPUT);
 
  Serial.begin(9600);
}

void loop()
{
  if (Serial.available() > 0)
  {
    value = Serial.read();
   
    digitalWrite(verte, LOW);
    digitalWrite(rouge, LOW);
    digitalWrite(blanche, LOW);
   
    if (value == 79) // Nouveau message (O)
    {
      digitalWrite(verte, HIGH);
    }
    if (value == 78) // Pas de nouveau message (N)
    {
      digitalWrite(rouge, HIGH);
    }
    if (value == 69) // Erreur (E)
    {
      digitalWrite(blanche, HIGH);
    }
  }
 
}

chicotore

#27
Mar 08, 2011, 09:53 pm Last Edit: Mar 08, 2011, 09:55 pm by chicotore Reason: 1
Ah ok  ;) pour le faire avec 3 LED c'est bon j'ai réussit le montage et ça fonctionne ( une bleu, une rouge et une verte ) mais je voulais essayer de la faire clignoter  ;)

La faire clignoter c'est du genre vraiment compliqué ?

Si c'est le cas je laisse tombé ce premier projet, j'en est déjà un deuxième en tête. Fait réagir une série de LED ( RGB ou non suivant laquelle de ma commande ebay arrive en premier ) en fonction de la musique avec un petit micro electret ! j'ai d'ailleurs commencé un schémas ^^

j'aimerais avoir ce rendu :  http://www.youtube.com/watch?v=HPhm8VTCWpg&feature=player_embedded

j'ai trouvé ce schémas:



que j'ai essayer de retranscrire en "visuel" comme ça :



mais pas sur que ce soit bon ^^


thanks a lot :)
Mon Blog sur l'environnement Arduino ... Tutos fait par un débutant pour les débutants ^^

http://chicowebsite.free.fr/

Darel

Ce n'est pas non plus infaisable...
C'est encore et toujours une histoire de boucle, d'agencement de ton code...
Si tu y tiens tant que ça, fais le, mais c'est se compliquer la vie pour rien quand on peux faire si simple.

chicotore

Re, j'ai une petite question a propos de ton code :
Quote
if (value == 79) // Nouveau message (O)
    {
      digitalWrite(verte, HIGH);
    }
    if (value == 78) // Pas de nouveau message (N)
    {
      digitalWrite(rouge, HIGH);
    }
    if (value == 69) // Erreur (E)
    {
      digitalWrite(blanche, HIGH);


En faite d'ou vienne les valeurs 79,78 et 69 ?

Dans mon code j'avais 110 pour "n" et pas 79
109 pour "m" et pas 78

EDIT: en fait je vient de capter que c'étais en majuscule dans ton code et en minuscule dans le miens, donc c'est OK ^^
Mon Blog sur l'environnement Arduino ... Tutos fait par un débutant pour les débutants ^^

http://chicowebsite.free.fr/

Go Up