Proiectul ăsta pornește de obicei de la o întrebare simplă: „vreau să știu pe telefon când se deschide ușa de la garaj sau de la magazie”. Un sistem de alarmă certificat e soluția corectă pentru o casă sau o firmă. Pentru o anexă, un depozit mic sau pur și simplu ca exercițiu, un Raspberry Pi cu un senzor PIR, un contact magnetic și un bot Telegram rezolvă problema într-o după-amiază.
Avertismentul îl spunem de la început, ca să nu rămână la final: asta nu e o centrală de alarmă. Nu are acumulator, nu are sirenă, nu are comunicator GSM de rezervă și nu respectă standardul EN 50131. Dacă pică internetul sau curentul, nu primiți nimic.
Piesele
- orice Raspberry Pi cu pini GPIO (un Pi 3B+ vechi e perfect, nu e nevoie de putere);
- un senzor PIR HC-SR501, cel mai comun modul, costă câțiva lei;
- un contact magnetic pentru uși (de tipul MC-38, cu fire), normal deschis când magnetul e departe;
- câteva fire dupont mamă-mamă și, pentru montaj definitiv, cablu de alarmă cu 4 fire.
Cum se leagă
Numerotarea de mai jos e cea BCM (GPIO), nu numărul fizic al pinului.
- PIR: VCC la pinul fizic 2 (5 V), GND la pinul 6, OUT la GPIO17 (pinul fizic 11). Ieșirea modulului HC-SR501 e de 3,3 V, deci se poate lega direct.
- Contact ușă: un fir la GPIO27 (pinul fizic 13), celălalt la un GND (pinul 14). Nu are polaritate.
Pe modulul PIR sunt două potențiometre: unul pentru sensibilitate, celălalt pentru timpul cât ieșirea rămâne activă. Puneți timpul la minimum (răsuciți spre stânga) și lăsați programul să decidă cât de des trimite alerte. Jumperul de pe modul îl puneți pe „H” (repetabil).
Atenție la un detaliu care ne-a costat o jumătate de oră prima dată: după alimentare, HC-SR501 are nevoie de aproximativ un minut ca să se stabilizeze. În acest timp dă declanșări false. E normal.
Botul de Telegram
- În Telegram, căutați @BotFather, trimiteți
/newbot, alegeți un nume. Primiți un token de forma123456789:AA.... Tratați-l ca pe o parolă. - Trimiteți orice mesaj noului bot, ca să deschideți conversația.
- Într-un browser, deschideți
https://api.telegram.org/bot<TOKEN>/getUpdates. În răspuns căutați"chat":{"id":.... Acel număr e chat_id-ul vostru.
Programul
Pe Raspberry Pi OS Lite instalați bibliotecile (pe versiunea cu desktop sunt deja acolo):
sudo apt install python3-gpiozero python3-requests -y
Creați fișierul /opt/alarma/alarma.py:
#!/usr/bin/env python3
import os
import time
from datetime import datetime
from signal import pause
import requests
from gpiozero import MotionSensor, Button
TOKEN = os.environ["TG_TOKEN"]
CHAT = os.environ["TG_CHAT"]
pir = MotionSensor(17)
usa = Button(27, pull_up=True, bounce_time=0.2)
ultima = {}
def trimite(text, cheie, pauza):
acum = time.monotonic()
if acum - ultima.get(cheie, -pauza) < pauza:
return
ultima[cheie] = acum
try:
requests.post(
f"https://api.telegram.org/bot{TOKEN}/sendMessage",
data={"chat_id": CHAT, "text": text},
timeout=10,
)
except requests.RequestException as e:
print("Eroare Telegram:", e, flush=True)
def miscare():
trimite(f"Mișcare în garaj, {datetime.now():%H:%M:%S}", "pir", 60)
def usa_deschisa():
trimite(f"Ușa s-a deschis, {datetime.now():%H:%M:%S}", "usa", 10)
pir.when_motion = miscare
usa.when_released = usa_deschisa
print("Alarma pornită", flush=True)
pause()
Două lucruri de explicat. Contactul magnetic se închide când ușa e închisă (magnetul e lângă el), deci pentru gpiozero „butonul” e apăsat. Când ușa se deschide, contactul se desface și se declanșează when_released. Dacă la voi e invers (unele contacte sunt normal închise), folosiți when_pressed.
Al doilea: funcția trimite are o pauză minimă între mesaje de același tip. Fără ea, cineva care se plimbă prin garaj vă trimite zeci de notificări pe minut.
Tokenul nu stă în cod
Creați /etc/alarma.env:
TG_TOKEN=123456789:AA...
TG_CHAT=987654321
Și restrângeți accesul:
sudo chmod 600 /etc/alarma.env
Pornire automată cu systemd
Fișierul /etc/systemd/system/alarma.service:
[Unit]
Description=Alarma garaj (PIR + contact usa)
After=network-online.target
Wants=network-online.target
[Service]
EnvironmentFile=/etc/alarma.env
ExecStart=/usr/bin/python3 /opt/alarma/alarma.py
Restart=always
RestartSec=5
User=root
[Install]
WantedBy=multi-user.target
Rulăm ca root aici pentru simplitate, ca să poată citi fișierul env. Dacă vreți să fie mai curat, creați un utilizator dedicat, adăugați-l în grupul gpio și schimbați proprietarul fișierului env.
sudo systemctl daemon-reload
sudo systemctl enable --now alarma
journalctl -u alarma -f
Deschideți ușa, treceți prin fața senzorului și urmăriți jurnalul. Ar trebui să primiți ambele mesaje în câteva secunde.
Unde se strică de obicei
Firele lungi. Peste 10-15 metri de cablu neecranat până la contactul de ușă, intrările GPIO pot culege paraziți și dau declanșări false. bounce_time ajută puțin. Ce ajută cu adevărat e un cablu de alarmă bun și, la distanțe mari, un optocuplor.
PIR-ul lângă surse de căldură. Un calorifer, o centrală sau soarele direct pe senzor produc alarme fără niciun om prin preajmă. Montați-l pe perete, la 2-2,5 m, orientat spre ușă, nu spre fereastră.
Cardul SD. După o pană de curent bruscă, cardurile ieftine se corup. Merită activat sistemul de fișiere read-only din raspi-config (Performance Options > Overlay File System) după ce totul funcționează.
De aici, extinderile vin natural: un releu pentru o sirenă mică, armare și dezarmare prin comenzi trimise botului, sau o fotografie de la o cameră IP atașată la mesaj. Fiecare merită un articol separat.