from gpiozero import MotionSensor, Buzzer, LED from flask import Flask, render_template_string, redirect, url_for, request import threading import time as time_module import requests from datetime import datetime, time as dtime # GPIO-Pins PIR_PIN = 17 BUZZER_PIN = 18 LED_PIN = 27 PIN_CODE = "1811" # Telegram-Konfiguration TELEGRAM_BOT_TOKEN = "8295131851:AAEGTotKaTzIvAxqxcNYk90zNOFx12vVNfk" TELEGRAM_CHAT_ID = "8428261562" # Raspberry-PI Anschlusssensoren pir = MotionSensor(PIR_PIN) buzzer = Buzzer(BUZZER_PIN) led = LED(LED_PIN) app = Flask(__name__) manual_armed = False # manuell scharf/unscharf night_override_off = False # Nachtmodus für diese Nacht deaktiviert last_event = None event_log = [] def send_telegram_message(text: str): # Schickt eine Nachricht über das Telegram-Bot-API. if not TELEGRAM_BOT_TOKEN or not TELEGRAM_CHAT_ID: print("Telegram nicht konfiguriert, überspringe Nachricht.") return url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage" try: response = requests.post(url, json={ "chat_id": TELEGRAM_CHAT_ID, "text": text, }) if not response.ok: print("Telegram-Fehler:", response.text) except Exception as e: print("Fehler beim Senden an Telegram:", e) def log_event(text: str): # Speichert Ereignis mit Zeitstempel und gibt es aus. global last_event, event_log ts = datetime.now().strftime("%Y-%m-%d %H:%M:%S") entry = f"[{ts}] {text}" last_event = entry event_log.insert(0, entry) event_log = event_log[:20] print(entry) def alarm_on(): buzzer.on() led.on() def alarm_off(): buzzer.off() led.off() # Zeitfenster geht über Mitternacht: [22:30, 24:00) U [00:00, 06:00) def is_night_window(): now = datetime.now().time() start = dtime(22, 30) end = dtime(6, 0) return now >= start or now < end def is_system_armed(): # Effektiver Scharf-Status: # - Wenn Nachtfenster aktiv und nicht übersteuert → scharf # - Sonst nach manuellem Status if is_night_window() and not night_override_off: return True return manual_armed def monitor_motion(): # Läuft in einem Hintergrundthread und überwacht den PIR. global night_override_off while True: try: # Nacht-Override zurücksetzen, wenn man nicht mehr im Nachtfenster ist if not is_night_window() and night_override_off: night_override_off = False log_event("Nacht-Override zurückgesetzt (neuer Tag).") if pir.motion_detected: if is_system_armed(): log_event("Bewegung erkannt! Alarm ausgelöst.") alarm_on() send_telegram_message("Bewegung erkannt! Alarm auf deinem Raspberry Pi!") time_module.sleep(5) # Alarmdauer alarm_off() else: log_event("Bewegung erkannt, aber System ist UNSCHARF.") time_module.sleep(2) time_module.sleep(0.1) except Exception as e: print("Fehler in monitor_motion:", e) time_module.sleep(1) # Weboberfläche (Flask) HTML_TEMPLATE = """
Für alle Aktionen wird der PIN benötigt.