Hi zusammen,
erstmal kurzes vorwort damit es leichter zu verstehen ist. Ich habe ein Projekt in meinem Ausbildungsbetrieb bekommen, per Magnetschalter eine Überwachung für das Rolltor zu bauen. Ich habe es mittlerweile geschafft, dass bei Statusänderung automatisch in der Commandline eine Nachricht erscheint mit Timestamp und dem Aktuellen Status nur habe ich das Problem, dass sobald der Code gestartet wird sich der Timestamp nicht mehr ändert. Habe ich hier einen Denkfehler? Geht das überhaupt nicht?
Des weiteren, würde ich zeitgleich eine *.txt Datei erstellen mit dem genannten Timestamp und der Statusänderung erzeugen also quasi ein LOG (alle änderungen sollen in die gleiche Datei geschrieben werden) Wie ist das möglich?
Hier der Code:
from datetime import datetime
import signal
import sys
import RPi.GPIO as GPIO
MAGNET_GPIO = 17
jetzt = datetime.now()
datum_zeit = jetzt.strftime("%Y-%m-%d %H:%M:%S")
def signal_handler (sig, frame):
GPIO.cleanup()
sys.exit(0)
def button_callback(channel):
if not GPIO.input(MAGNET_GPIO):
print(f"{datum_zeit}:" "tor offen")
wert = 1
else:
print(f"{datum_zeit}:" "Tor geschlossen")
wert = 0
if __name__ == '__main__':
GPIO.setmode(GPIO.BCM)
GPIO.setup(MAGNET_GPIO, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.add_event_detect(MAGNET_GPIO, GPIO.BOTH, callback=button_callback, bouncetime=50)
signal.signal (signal.SIGINT, signal_handler)
signal.pause()
Ich hoffe es war halbwegs verständlich und bedanke mich im voraus für die Antworten.
Raspberry Pi zeigt nur eine uhrzeit an
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 8.
`as` bei Import ist zum Umbenennen da, GPIO wird aber gar nicht umbenannt. Das `as` macht also so keinen Sinn, wobei GPIO nach Konvention eigentlich gpio geschrieben sein sollte.
`signal_handler` sollte man nicht verwenden, ein einfaches try-finally wäre hier sowieso viel besser.
Innerhalb von callbacks sollte möglichst wenig passieren, vor allem irgendwelcher IO sollte es da nicht geben; normalerweise setzt ein callback einfach ein Event, das man dann im Hauptprogramm abfragen kann.
In Deinem Fall wieder wäre ein `wait_for_edge` deutlich lesbarer.
Das Hauptprogramm sollte in einer Funktion stehen.
Das ganz sollte also eher so aussehen:
Da `jetzt` außerhalb der Schleife gesetzt wird, ändert es sich innerhalb der Schleife auch nicht mehr.
`as` bei Import ist zum Umbenennen da, GPIO wird aber gar nicht umbenannt. Das `as` macht also so keinen Sinn, wobei GPIO nach Konvention eigentlich gpio geschrieben sein sollte.
`signal_handler` sollte man nicht verwenden, ein einfaches try-finally wäre hier sowieso viel besser.
Innerhalb von callbacks sollte möglichst wenig passieren, vor allem irgendwelcher IO sollte es da nicht geben; normalerweise setzt ein callback einfach ein Event, das man dann im Hauptprogramm abfragen kann.
In Deinem Fall wieder wäre ein `wait_for_edge` deutlich lesbarer.
Das Hauptprogramm sollte in einer Funktion stehen.
Das ganz sollte also eher so aussehen:
Code: Alles auswählen
from datetime import datetime
import time
import RPi.GPIO as gpio
MAGNET_GPIO = 17
def main():
try:
gpio.setmode(gpio.BCM)
gpio.setup(MAGNET_GPIO, gpio.IN, pull_up_down=gpio.PUD_UP)
jetzt = datetime.now()
while True:
gpio.wait_for_edge(MAGNET_GPIO, gpio.BOTH)
if not gpio.input(MAGNET_GPIO):
print(f"{jetzt:%Y-%m-%d %H:%M:%S}:" "tor offen")
else:
print(f"{jetzt:%Y-%m-%d %H:%M:%S}:" "Tor geschlossen")
time.sleep(0.05)
finally:
gpio.cleanup()
if __name__ == '__main__':
main()