Python Wiederholung der Funktion für x-Min sperren

OP #4853365
Ich dachte an folgende Vorgehensweise, da ich mir das Schlafen währen 
dieser Zeit nicht leisten kann:
1
def SendMail(x):
2
        global lastSendTime
3
        server = smtplib.SMTP('smtp.gmail.com:587')
4
        server.starttls()
5
        server.login(username,password)
6
        if localtime() > lastSendTime - 1 Minute
7
              server.sendmail(fromaddr, toaddrs, msg1)
8
              lastSendTime = localtime()
9
        server.quit()

Wie lautet die Zeile korrekt: if localtime() > lastSendTime - 1 Minute

Würde das so funktionieren?

Wie kann ich so tun, als würde ich das Programm für meinen Raspberry 
schreiben, obwohl keiner an dem PC angeschlossen ist?
Gast #4853370
Der genaue Anwendungsfall ist mir auch noch nicht ganz klar.
Vielleicht sowas in der Art?

1
#!/usr/bin/env python
2

3
import time
4

5

6
def test():
7
    now = time.time()
8

9
    # Sind weniger als 3 Sekunden seit dem letzten Aufruf dieser Funktion vergangen?
10
    if now - test.last_call < 3:
11
        return
12

13
    # Alles ab hier wird höchstens alle 3 Sekunden ausgeführt werden:
14
    print "Hello, World!"
15

16
    # Zeitpunkt der letzten Ausführung speichern:
17
    test.last_call = now
18

19
# Variable muss vor dem ersten Aufruf der Funktion initialisiert worden sein!
20
test.last_call = 0
21

22

23
while True:
24
    test()  # --> Wird nur alle 3 Sekunden "tatsächlich ausgeführt", wenn man das so nennen will.
OP #4853438
Ich habs nun so (ähnlich) gemacht und dachte, dass es so passen müsste:
1
#!/usr/bin/env python
2
# -*- coding: utf-8 -*-
3
import RPi.GPIO as GPIO
4
import smtplib
5
import time
6

7
BtnPin = 13
8
Gpin   = 12
9
Rpin   = 11
10
cnt = 0
11
last_call = 0
12

13

14
fromaddr = 'xx@googlemail.com'
15
toaddrs  = 'xx@googlemail.com'
16
msg1 = """From: Raspberry Pi Alarmsystem
17
To: xx@googlemail.com
18
Subject: Lichtschranke unterbrochen
19

20
Achtung: Die Lichtschranke wurde unterbrochen, bitte pruefen sie die Ursache!
21
"""
22
msg2 = """From: Raspberry Pi Alarmsystem
23
To: xx@googlemail.com
24
Subject: Lichtschranke unterbrochen (dauerhaft)
25

26
Achtung: Ihre Lichtschranke ist immer noch unterbrochen, bitte pruefen sie die Ursache!
27
"""
28
username = 'xx@googlemail.com'
29
password = 'xx'
30

31
def setup():
32
  GPIO.setmode(GPIO.BOARD)       # Numbers GPIOs by physical location
33
  GPIO.setup(Gpin, GPIO.OUT)     # Set Green Led Pin mode to output
34
  GPIO.setup(Rpin, GPIO.OUT)     # Set Red Led Pin mode to output
35
  GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)    # Set BtnPin's mode is input, and pull down to low
36
  GPIO.add_event_detect(BtnPin, GPIO.BOTH, callback=detect, bouncetime=1000)
37

38

39
def Led(x):
40
  if x == 1:
41
    GPIO.output(Rpin, 1)
42
    GPIO.output(Gpin, 0)
43
  if x == 0:
44
    GPIO.output(Rpin, 0)
45
    GPIO.output(Gpin, 1)
46

47
def SendMail(x):
48
  global last_call
49
  now = time.time()
50
  if now - last_call < 60:
51
          return
52
  # Sind weniger als 3 Sekunden seit dem letzten Aufruf dieser Funktion vergangen?
53
  server = smtplib.SMTP('smtp.gmail.com:587')
54
  server.starttls()
55
  server.login(username,password)
56
  if x == 0:
57
    if cnt < 2:
58
      server.sendmail(fromaddr, toaddrs, msg1)
59
      print("Lichtschranke unterbrochen > Mail gesendet")
60
  if x == 1:      #
61
                server.sendmail(fromaddr, toaddrs, msg2)
62
                print("Lichtschranke immer noch unterbrochen > erneut Mail gesendet")
63
  server.quit()
64
  # Zeitpunkt der letzten Ausführung speichern:
65
  last_call = now
66

67
def WriteFile():
68
        date = time.strftime("%x")
69
        zeit = time.strftime("%X2")
70
        fileout = open("/home/pi/Desktop/Lichtschranke.txt","a")
71
        time.sleep(0.1)
72
        fileout.write(date+";"+zeit+"; Die Lichtschranke wurde unterbrochen \n")
73
        time.sleep(0.1)
74
        fileout.close()
75
        print("Log-File geschrieben")
76

77
def detect(chn):
78
        time.sleep(0.1)
79
        print("in der detect ", GPIO.input(BtnPin))
80
        if GPIO.input(BtnPin) == GPIO.LOW:      # Lichtschranke wurde unterbrochen
81
                WriteFile()
82
                Led(1)
83
                print("detect")
84
                SendMail(0)
85

86
        if GPIO.input(BtnPin) == GPIO.HIGH:     # Lichtschranke wieder frei
87
                print("wieder frei")
88
                Led(0)
89

90
def cntUnterbrochen(u):
91
        global cnt
92
        if u == 0:
93
                cnt = cnt + 1
94
                print("cnt aufaddieren = ", cnt)
95
                if cnt == 300: # 600 entspricht 10 min
96
                        cnt = 0
97
                        SendMail(1)
98

99
        if u == 1:
100
                cnt = 0
101
                print("cnt rucksetzen = ", cnt)
102

103
def loop():
104
        while True:
105
                time.sleep(1)
106
                cntUnterbrochen(GPIO.input(BtnPin))
107
                print("main ",GPIO.input(BtnPin))
108

109

110
def destroy():
111
  GPIO.output(Gpin, GPIO.HIGH)       # Green led off
112
  GPIO.output(Rpin, GPIO.HIGH)       # Red led off
113
  GPIO.cleanup()                     # Release resource
114

115
if __name__ == '__main__':     # Program start from here
116
  setup()
117
  try:
118
    loop()
119
  except KeyboardInterrupt:  # When 'Ctrl+C' is pressed, the child program destroy() will be  executed.
120
    destroy()

Nun bekomm ich aber die Fehlermeldung im Anhang, mit der ich leider gar 
nichts anfangen kann. Könnte hier mal wer drüberschauen? DANKE
P.S. Weitere Verbesserungsvorschläge sind erwünscht
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.