Anfängerfrage Logging

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
timeo.schmidt
User
Beiträge: 1
Registriert: Freitag 30. Oktober 2015, 17:40

Guten Abend,
Bin neu hier im Forum und hab auch bisher nicht so viel Erfahrung im Bereich Programmieren allgemein.
Ich wollte einfach mal zum üben einen Python Code schreiben, der eine Tür loggen soll.
Wenn sie aufgeht wird eine Zeile in eine Logfile eingetragen, wenn sie schließt genau so.
Ich setze das ganze mit einem Pi umsetzen. Ich habe es schon hinbekommen eine Logfile zu schreiben, jedoch werden beim öffnen/schließen der Tür dank einer

Code: Alles auswählen

while(True):
Schleife hunderte Zeilen in die Logfile hinzugefügt. Ich wollte es so haben das bei einer Aktion immer nur ein Eintrag in die Logfile geschrieben wird.

Hier mein Code bis jetzt:

Code: Alles auswählen

#Door Logfilemaker

import time
import RPi.GPIO as GPIO
import logging

GPIO.setmode(GPIO.BCM)
GPIO.setup(17,GPIO.IN)

logging.basicConfig(filename='door.log', format='%(asctime)s %(message)s', datefmt='%d/%m/%Y %I:%M:%S %p')

x = 0
status = GPIO.input(17)

print(status)

while True:
        if (x == 0) and (status == 0):
                logging.warning('  ||   Door was opened!')
                print('Door was opened!')
                x = 1
                if (x == 1) and (status == 1):
                        logging.warning('  ||   Door was closed!')
                        print('Door was closed!')
                        x = 0

Ich bin sicher es geht einfacher aber meine Kenntnisse sind bisher begrenzt(wie man sieht :lol: )
x13a
User
Beiträge: 5
Registriert: Donnerstag 13. August 2015, 14:11

Code: Alles auswählen

#Door Logfilemaker
 
import time
import RPi.GPIO as GPIO
import logging
 
GPIO.setmode(GPIO.BCM)
GPIO.setup(17,GPIO.IN)
 
log = open("door.log", "w")

x = 0
status = GPIO.input(17)

print(status)
 
while True:
        logtime = time.strftime("%d/%m/%Y %I:%M:%S %p")
        if (x == 0) and (status == 0):
                log.write('  ||   Door was opened!  ' + logtime + '\n')
                print('Door was opened!')
                x = 1
                if (x == 1) and (status == 1):
                        log.write('  ||   Door was closed!  ' + logtime + '\n')
                        print('Door was closed!')
                        x = 0
ohne den Code komplett um zu schreiben (der Code ist jedoch ziemlich ....)
leg dir ein ordentliches Buch über Python3 zu
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Also zuerst einmal wäre da Zeile 13: Das liest doch nur *einmal* den Eingang aus - Du brauchst es aber kontinuierlich! Das ganze muss also irgend wo in eine Schleife hinein!

Als nächstes kommt die Logik: Du musst Dir halt immer den alten Zustand merken und mit dem aktuellen vergleichen. Nur bei einer Änderung musst Du dann agieren. Ich gestehe, dass ich mir Deine aktuelle Logik nicht zu genau angeguckt habe, aber alleine die Einrückung sagt mir, dass das so nicht stimmen sollte...

@x13a: Und was löst das jetzt genau? An der kaputten Logik und dem grundsätzlichen Fehler ändert das nix...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@x13a: die Frage was auch _nicht_ "eliminiere die Nutzung des logging-Moduls"...

@timeo.schmidt: ungetestet -

Code: Alles auswählen

import time
import RPi.GPIO as GPIO
import logging
 
GPIO.setmode(GPIO.BCM)
GPIO.setup(17,GPIO.IN)
 
logging.basicConfig(filename='door.log', format='%(asctime)s %(message)s', datefmt='%d/%m/%Y %I:%M:%S %p')
 
current_state = GPIO.input(17)
if current_state == 0:
    door_open = True
else:
    door_open = False
print(current_state)
 
while True:
    state = GPIO.input(17)
    if state == 0 and not door_open:
        logging.warning('  ||   Door was opened!')
        print('Door was opened!')
        door_open = True
    elif state == 1 and door_open:
        logging.warning('  ||   Door was closed!')
        print('Door was closed!')
        door_open = False
    time.sleep(1)
Gruß, noisefloor
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@timeo.schmidt: Dein Programmablauf müsste so aussehen:

Code: Alles auswählen

while True:
    status = get_status()
    if not x and not status:
        # handle door opened
    elif x and status:
        # handle door closed
    time.sleep(some_time)

Anstelle der letzten Zeile könntest Du auch schauen, ob der Raspi auch das warten auf GPIO-Events erlaubt. Mangels Raspi weiß ich dies nicht, aber per kurzer Google-Search scheint dies möglich zu sein.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
ob der Raspi auch das warten auf GPIO-Events erlaubt
Geht. Du kannst an einem Pin lauschen und eine Callback-Funktion aufrufen, die bei Status-Änderung des Pins aufgerufen wird.

Gruß, noisefloor
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@noisefloor: Die Zeilen 10 - 15 sind jetzt aber nur aus Anfängergründen so, oder? ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
@noisefloor: Die Zeilen 10 - 15 sind jetzt aber nur aus Anfängergründen so, oder?
.
Natürlich. Sollte ja kein kompletter re-write werden ;-)

Gruß, noisefloor
Antworten