
Ich arbeite gerade an einem Projekt, eine bestehende Alarmanlage in meinem Gartenhaus mit einem selbstgebauten GSM-Wählgerät zu erweitern. Dazu habe ich ein Pi2 genommen, bei dem die Eingänge über Relais der Alarmanlage angesteuert werden sollen. Die Ereignisse werden in einer Log gespeichert, Alarmmeldungen sollen zusätzlich als SMS übertragen werden.
Das Skript läuft soweit schon so wie es soll. Einziges Problem ist, dass es bei Auslösung eines Kontaktes auch die Zustände der anderen Kontakte in die Log schreibt bzw. eine SMS versendet.
Es gibt die drei Ereignisse (Scharf/Unscharf, Alarm/Alarm Rückstellung, Störung/Störungs Rücksetzung).
Beispiel: Alle Kontakte sind geschlossen, die anlage hat die Zustände Unscharf, Alarm rückgesetzt und Störung rückgesetzt. Wenn ich nun den Störungskontakt öffne, dann werden folgende Dinge gelogt: Unscharf, Alarm rückgesetzt, Störung. Dabei möchte ich in dem Fall natürlich nur die Zustandsänderung der Störung loggen.
Das Skript sieht wie folgt aus:
Code: Alles auswählen
#!/usr/bin/python3
import os
import RPi.GPIO as IO
import time
import datetime
TELEPHON_NUMBERS = "/home/pi/Alarm/alarm-system-dialer/telephonnumbers.txt"
LOGFILE = "/home/pi/Alarm/alarm-system-dialer/log.txt"
IO.setmode(IO.BCM)
ALARM_PIN = 22
ARM_PIN = 5
ERROR_PIN = 17
SYSTEM_STATUS = 26
IO.setup(SYSTEM_STATUS, IO.OUT)
IO.setup(ALARM_PIN, IO.IN, pull_up_down=IO.PUD_DOWN)
IO.setup(ARM_PIN, IO.IN, pull_up_down=IO.PUD_DOWN)
IO.setup(ERROR_PIN, IO.IN, pull_up_down=IO.PUD_DOWN)
def arm_disarm(channel):
msg = "Scharf" if IO.input(ARM_PIN) == 0 else "Unscharf"
with open(LOGFILE, 'a') as log:
log.write('{} {}\n'.format(datetime.datetime.now(), msg))
def system_error(channel):
msg = "Stoerung" if IO.input(ERROR_PIN) == 0 else "Stoerung beendet"
with open(LOGFILE, 'a') as log:
log.write('{} {}\n'.format(datetime.datetime.now(), msg))
def alarm_detection(channel):
msg = "Einbruchalarm" if IO.input(ALARM_PIN) == 0 else "Einbruchalarm beendet"
with open(LOGFILE, 'a') as log:
log.write('{} {}\n'.format(datetime.datetime.now(), msg))
with open(TELEPHON_NUMBERS, 'r') as numbers:
for number in numbers:
os.system('echo Alarmanlage meldet: %s | sudo gammu-smsd-inject TEXT %s' % (msg, number))
IO.add_event_detect(ALARM_PIN, IO.BOTH, callback=alarm_detection, bouncetime=100)
IO.add_event_detect(ARM_PIN, IO.BOTH, callback=arm_disarm, bouncetime=100)
IO.add_event_detect(ERROR_PIN, IO.BOTH, callback=system_error, bouncetime=100)
try:
while True:
time.sleep(0.1)
IO.output(SYSTEM_STATUS, IO.LOW)
except KeyboardInterrupt:
IO.cleanup()
Code: Alles auswählen
2017-11-28 12:43:23.727971 Einbruchalarm beendet
2017-11-28 12:43:23.730008 Stoerung beendet
2017-11-28 12:43:23.731050 Unscharf
2017-11-28 12:43:26.194756 Unscharf
2017-11-28 12:43:26.828675 Stoerung beendet
2017-11-28 12:43:26.829609 Einbruchalarm beendet
2017-11-28 12:43:27.542416 Unscharf
2017-11-28 12:43:30.178337 Unscharf
2017-11-28 12:43:30.241358 Einbruchalarm beendet
2017-11-28 12:43:30.243009 Stoerung beendet