• Benvenuti su RaspberryItaly!
Benvenuto ospite! Login Login con Facebook Registrati Login with Facebook


Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5

[-]
Tags
python script avvio all accensione

(Risolto) Avvio script Python all'accensione
#1
Ciao,
questo problema è già stato trattato diverse volte, ma le ricerche online non mi hanno aiutato...
Ho fatto un piccolo programmino in Python per far si che mettendo a gnd un pin del GPIO, raspberry invii una mail, ve lo posto:

import RPi.GPIO as GPIO
import smtplib

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

GPIO.setup(17, GPIO.IN)

fromaddr = 'xxx@gmail.com'  (ind. mail della casella usata da raspberry)
toaddr = 'xxx@hotmail.com'  (( ind. mail a cui invio la mail)
msg = 'pulsante premuto'

username = 'xxx@gmail.com'   (credenziali accesso mail)
password = 'xxx'

server = smtplib.SMTP('smtp.gmail.com:587')

while (True):
   if GPIO.input(17) == False:
      server.starttls()
      server.login(username, password)
      server.sendmail(fromaddr, toaddr, msg)
      server.quit()

Il pin 17 è tenuto alto da una resistenza di pullup, ed è corredato da filtro passa basso per i vari disturbi.

Se da riga di comando faccio:  python /home/pi/Desktop/Invio_Mail.py lo script si avvia
premendo il tasto la mail viene inviata, quindi deduco che lo script sia fatto bene; però i problemi che riscontro sono 2:
dopo il primo invio mail, se ripremo il tasto, non viene più eseguito nulla...
All'avvio di raspberry lo script non si avvia da solo.

Per fare ciò, ho aggiunto il comando nel file /etc/rc.local come si vede quà sotto, dopo l'avvio della vpn:

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

# enable nat iptables rule
/etc/openvpn/up.sh
# avvia script per invio mail
/home/pi/Desktop/Invio_Mail.py &
exit 0

Ho anche aggiunto la seguente riga nel file sudo crontab -e
@reboot python /home/pi/Desktop/Invio_Mail.py &

Però lo script continua a non avviarsi, dove sbaglio?

Grazie a tutti
Risposta
#2
In /etc/local richiami lo script, ma non è un eseguibile, devi anteporre python
Codice:
python home/pi/Desktop/Invio_Mail.py
Lo script lo trovo macchinoso per l'utilizzo di RPi.GPIO. Gpiozero è molto più snello e gestisce automaticamente i parametri gpio per un pulsante (imposta come input, pull up, antirimbalzo ecc).

Inviato dal mio A0001 utilizzando Tapatalk
Risposta
#3
qualcosa tipo questo (non lo ho provbato, sono sottto proxy che blocca quel tipo di chiamate SMTP)
Codice:
#-------------------------------------------------------------------------------
#  @2019 by Zzed - prova invio mail alla pressione di un pulsante

import smtplib
from gpiozero import Button
from signal import pause

# impostazioni
pulsante = Button(17)
fromaddr = 'xxx@gmail.com'  # ind. mail della casella usata da Raspberry
toarddr = 'xxx@hotmail.com' # ind. mail a cui invio la mail
username = 'xxx@gmail.com'  # user accesso mail
password = 'xxx'            # la tua password

def sendmail(contenuto):
   mail = smtplib.SMTP('smtp.gmail.com', 587) # questa configurazione funziona per gmail
   mail.ehlo() # protocollo per extended SMTP
   mail.starttls() # email criptata
   mail.login(username, password)
   mail.sendmail(fromaddr, toaddr, contenuto)
   mail.close()


def main():
   pulsante.when_pressed = sendmail("prova")
   pause()

if __name__ == '__main__':
   main()
Risposta
#4
Ciao,
grazie per la risposta, per l'avvio all'accensione, era come hai detto, mancava di anteporre python all'istruzione, ora funziona, mi rimane il problema che dopo un invio, non ne fa più.

Ho provato il tuo codice, ma non fa nulla, io l'ho scritto sempre in python, giusto? Perdona l'ignoranza, ma sono proprio all'inizio; tra l'altro ci ho capito poco o nulla da come lo hai scritto tu, l'altro forse è più intuitivo...

Per adesso potrei utilizzare come avevo fatto? La cosa mi servirebbe, poi magari facendo pratica trovo altri metodi, altrimenti non ne vengo a capo Big Grin
grazie
Risposta
#5
Certo che puoi utilizzarlo come avevi fatto


Inviato dal mio A0001 utilizzando Tapatalk
Risposta
#6
(02/07/2019, 21:07)Zzed Ha scritto: Certo che puoi utilizzarlo come avevi fatto


Inviato dal mio A0001 utilizzando Tapatalk

Grazie, ma quindi il problema che esegue il codice una volta sola da cosa sarebbe causato? Il while non dovrebbe essere un ciclo infinito? Ho provato anche a mettere break in fondo al codice, ma fa uguale...
Grazie
Risposta
#7
Ciao,
ho risolto, bastava mettere questa istruzione dentro al ciclo while:
server = smtplib.SMTP('smtp.gmail.com:587')

Un'altra domanda, è possibile far si che la mail non mi vada nella casella dell'indesiderata?
Grazie di nuovo Wink
Risposta
#8
while (True): dovrebbe essere però errato.
è while True: senza parentesi
Anche server = smtplib.SMTP('smtp.gmail.com:587') dovrebbe essere server = smtplib.SMTP('smtp.gmail.com', 587)
A titolo didattico, sebbene funzioni, usare un ciclo infinito per controllare la pressione di un tasto non è una buona pratica: lo script continua a lavorare anche quando non si fa nulla. Sarebbe preferibile usare gli interrupt.

il fatto che venga considerata spam dipende dagli algoritmi del provider ricevente. però solitamente puoi impostare "non considerare spam la posta da questo mittente" o una opzione simile. puoi anche provare a mettere anche te stesso tra i destinatari
Risposta
#9
(04/07/2019, 00:30)Zzed Ha scritto: while (True): dovrebbe essere però errato.
è while True: senza parentesi
Anche server = smtplib.SMTP('smtp.gmail.com:587') dovrebbe essere server = smtplib.SMTP('smtp.gmail.com', 587)
A titolo didattico, sebbene funzioni, usare un ciclo infinito per controllare la pressione di un tasto non è una buona pratica: lo script continua a lavorare anche quando non si fa nulla. Sarebbe preferibile usare gli interrupt.

il fatto che venga considerata spam dipende dagli algoritmi del provider ricevente. però solitamente puoi impostare "non considerare spam la posta da questo mittente" o una opzione simile. puoi anche provare a mettere anche te stesso tra i destinatari

Ciao, nel while ho tolto le parentesi a true, e funziona, sono esempi che ho copiato da internet, ho appena iniziato con python e non so nulla di questo linguaggio, anche se simile al C, la sintassi è un po' diversa...
Ho anche corretto la stringa: smtplib.SMTP('smtp.gmail.com', 587) e tutto funziona.
E' difficile aggiungere l'oggetto della mail?

Ho notato che la % di lavoro di raspberry è sempre intorno al 25%, prima che facessi queste cose era bassissima, intorno al 2 - 3%, può dipendere da questo script che esegue il while infinito? Oppure è WebIOPi? Anche il processore scalda parecchio...

Per usare gli interrupt è molto complicato? Io ora come ora non saprei proprio come fare...
Infinite grazie
Risposta
#10
bè, stai seguendo guide preistoriche ;-)
Si, come dicevo, usare un ciclo infinito while True, va bene a scopo didattico, ma nel vero uso è una pratica decisamente sconsigliabile.
Usare gli interrupt è un po' complicato con Rpi.GPIO, enormemente più semplice con gpiozero (vedi su: pulsante.when_pressed .... pause() )
mettere l'oggetto della mail è un po' macchinoso con smtplib, il consiglio è usare ad esempio ]yagmail, che si usa molto più semplicemente così:
Codice:
import yagmail
yag = yagmail.SMTP('miamail@gmail.com', 'miapassword')
yag.send(to = 'hi@hi.com', subject ='oggetto della mail', contents = 'ecco qui il tuo messaggio')
non è preinstallata e va installata con
Codice:
pip3 install yagmail
per Python 3.x, mentre con
Codice:
pip install yagmail
per python 2
Risposta
  


Vai al forum:


Navigazione: 1 Ospite(i)
Forum con nuovi Post
Forum senza nuovi post
Forum bloccato
Forum Redirect