Ring, Nest Cam, Arlo – każdy z tych systemów pobiera 8–30 dolarów miesięcznie za możliwość przeglądania nagrań sprzed doby. Twoje nagrania trafiają na serwery Amazon, Google i innych gigantów. Czy naprawdę chcesz, żeby obcy serwer wiedział, o której wychodzisz do pracy?
Dobra wiadomość: za jednorazowy koszt sprzętu (200–400 zł) możesz zbudować system, który nigdy nie wysyła danych poza dom, przechowuje nagrania lokalnie i działa nawet bez internetu.
| Komponent | Rekomendacja | Cena |
|---|---|---|
| Komputer | Raspberry Pi 4 (4 GB) lub Pi 5 (4 GB) | ~280–380 zł |
| Karta pamięci | microSD 32 GB (klasa A2) lub SSD przez USB | ~30–80 zł |
| Kamera IP | TP-Link Tapo C310 / Reolink 810A / ESP32-CAM | ~80–250 zł |
| Dysk na nagrania | HDD USB 1 TB (opcjonalnie) | ~150 zł |
| Zasilanie | Oficjalny zasilacz Pi 27W (USB-C) | ~80 zł |
Frigate to otwartoźródłowy serwer NVR z wbudowaną detekcją obiektów. Działa jako kontener Docker i integruje się z Home Assistant, dając pełny system inteligentnego domu.
# Zainstaluj Docker na Raspberry Pi OS
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# Utwórz katalog projektu
mkdir ~/frigate && cd ~/frigate
nano docker-compose.yml
version: "3.9"
services:
frigate:
image: ghcr.io/blakeblackshear/frigate:stable
privileged: true
restart: unless-stopped
ports:
- "5000:5000" # Web UI
- "8554:8554" # RTSP
volumes:
- ./config:/config
- ./storage:/media/frigate
- /etc/localtime:/etc/localtime:ro
environment:
FRIGATE_RTSP_PASSWORD: "twoje_haslo"
# Plik config/config.yml
mqtt:
enabled: false
cameras:
kamera_wejscie:
ffmpeg:
inputs:
- path: rtsp://admin:twoje_haslo@192.168.1.100:554/stream1
roles:
- detect
- record
detect:
enabled: true
width: 1280
height: 720
fps: 5
record:
enabled: true
retain:
days: 7
mode: motion
snapshots:
enabled: true
retain:
default: 14
objects:
track:
- person
- car
- dog
detectors:
cpu1:
type: cpu
num_threads: 3
# Uruchomienie
docker compose up -d
# Sprawdź logi
docker compose logs -f frigate
Po 2–3 minutach otwórz w przeglądarce http://adres-raspberry-pi:5000 – zobaczysz panel Frigate z podglądem na żywo i zdarzeniami.
type: edgetpu.# W Home Assistant (jeśli masz) dodaj automatyzację:
# Trigger: Frigate event (person detected)
# Action: Telegram notification z załączonym zdjęciem
ntfy.sh to bezpłatny serwis push: zainstaluj aplikację ntfy na telefonie, zasubskrybuj kanał o unikalnej nazwie i dodaj do Home Assistant poniższy rest_command. Powiadomienia mogą docierać w kilka sekund od wykrycia obiektu.
# configuration.yaml – sekcja rest_command
rest_command:
frigate_ntfy:
url: "https://ntfy.sh/MojFrigate123" # zmień na unikalną nazwę kanału
method: POST
headers:
Title: "Frigate – alarm"
Priority: "high"
Tags: "camera,warning"
payload: "{{ message }}"
content_type: "text/plain"
# automations.yaml – trigger: zdarzenie MQTT z Frigate
- alias: "Frigate alarm → ntfy"
trigger:
- platform: mqtt
topic: frigate/events
action:
- service: rest_command.frigate_ntfy
data:
message: >
Kamera: {{ trigger.payload_json.before.camera }}
Obiekt: {{ trigger.payload_json.before.label }}
Signal jest przez wielu specjalistów uważany za jeden z bezpieczniejszych komunikatorów. Wymaga zainstalowania signal-cli na serwerze oraz zarejestrowania numeru telefonu jako nadawcy (można użyć starego telefonu lub numeru VoIP).
# Instalacja signal-cli (wymaga Java 17+)
sudo apt install default-jre -y
wget -q https://github.com/AsamK/signal-cli/releases/latest/download/signal-cli-0.13.0-Linux-native.tar.gz
tar xf signal-cli-*.tar.gz && sudo cp signal-cli-*/bin/signal-cli /usr/local/bin/
# Rejestracja numeru nadawcy (jednorazowo):
signal-cli -u +48TWOJNUMER register --no-captcha
signal-cli -u +48TWOJNUMER verify XXXXXX # podaj kod z SMS
# Test wysyłki:
signal-cli -u +48TWOJNUMER send \
-m "📷 Frigate – wykryto człowieka: wejście" \
+48ODBIORCY
# Integracja z Home Assistant (shell_command w configuration.yaml):
shell_command:
frigate_signal: >
signal-cli -u +48TWOJNUMER send
-m "📷 {{ camera }}: {{ label }}" +48ODBIORCY
Jeśli nie chcesz Home Assistant i wolisz prosty skrypt Pythona, to podejście jest dla Ciebie. Idealne dla ESP32-CAM lub zwykłej kamery USB.
sudo apt update && sudo apt install -y python3-pip python3-venv git
python3 -m venv ~/ai-kamera
source ~/ai-kamera/bin/activate
pip install ultralytics opencv-python-headless requests
from ultralytics import YOLO
import cv2, time, requests, os
from datetime import datetime
MODEL = YOLO("yolov8n.pt") # nano – najszybszy
RTSP_URL = "rtsp://admin:haslo@192.168.1.100:554/stream1"
TELEGRAM_TOKEN = os.getenv("TG_TOKEN", "")
TELEGRAM_CHAT = os.getenv("TG_CHAT", "")
SNOOZE_SEC = 30 # pauza między powiadomieniami
cap = cv2.VideoCapture(RTSP_URL)
last_alert = 0
CLASSES_WATCHED = {"person", "car", "dog"}
def wyslij_telegram(img_path: str, etykiety: list):
if not TELEGRAM_TOKEN:
return
tekst = "🚨 Wykryto: " + ", ".join(etykiety)
with open(img_path, "rb") as f:
requests.post(
f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendPhoto",
data={"chat_id": TELEGRAM_CHAT, "caption": tekst},
files={"photo": f},
timeout=10
)
print("Kamera AI uruchomiona…")
while True:
ret, frame = cap.read()
if not ret:
cap = cv2.VideoCapture(RTSP_URL)
time.sleep(1)
continue
wyniki = MODEL(frame, conf=0.45, verbose=False)[0]
etykiety = [MODEL.names[int(b.cls)] for b in wyniki.boxes
if MODEL.names[int(b.cls)] in CLASSES_WATCHED]
if etykiety and (time.time() - last_alert > SNOOZE_SEC):
ts = datetime.now().strftime("%Y%m%d_%H%M%S")
sciezka = f"/tmp/alert_{ts}.jpg"
cv2.imwrite(sciezka, wyniki.plot())
wyslij_telegram(sciezka, list(set(etykiety)))
last_alert = time.time()
print(f"Alert: {etykiety}")
time.sleep(0.2)
# Autostart przy starcie systemu
crontab -e
# Dodaj linię:
@reboot source /home/pi/ai-kamera/bin/activate && python /home/pi/detector.py &
Jeśli nie chcesz używać Telegrama, poniżej gotowe funkcje do wklejenia obok (lub zamiast) wyslij_telegram(). Zmienne środowiskowe ustawiasz w pliku .env lub przez export.
import os, requests, subprocess
# --- ntfy.sh (ustaw: export NTFY_URL=https://ntfy.sh/MojAlarm123) ---
NTFY_URL = os.getenv("NTFY_URL", "")
def wyslij_ntfy(img_path: str, etykiety: list):
if not NTFY_URL:
return
tekst = "📷 Wykryto: " + ", ".join(etykiety)
with open(img_path, "rb") as f:
requests.post(NTFY_URL, data=f.read(),
headers={"Title": tekst, "Filename": "alert.jpg", "Priority": "high"},
timeout=10)
# --- Signal (ustaw: export SIGNAL_FROM=+48NADAWCA SIGNAL_TO=+48ODBIORCA) ---
SIGNAL_FROM = os.getenv("SIGNAL_FROM", "")
SIGNAL_TO = os.getenv("SIGNAL_TO", "")
def wyslij_signal(img_path: str, etykiety: list):
if not SIGNAL_FROM or not SIGNAL_TO:
return
tekst = "📷 Wykryto: " + ", ".join(etykiety)
subprocess.run(["signal-cli", "-u", SIGNAL_FROM,
"send", "-m", tekst, "--attachment", img_path, SIGNAL_TO],
capture_output=True)
# --- e-mail (ustaw: export ALERT_EMAIL=twoj@email.com) ---
ALERT_EMAIL = os.getenv("ALERT_EMAIL", "")
def wyslij_email(etykiety: list):
if not ALERT_EMAIL:
return
tekst = "Wykryto: " + ", ".join(etykiety)
subprocess.run(["mail", "-s", "Alert kamery AI", ALERT_EMAIL],
input=tekst.encode(), capture_output=True)
# Wywołaj którąkolwiek (lub kilka) zamiast/obok wyslij_telegram():
# wyslij_ntfy(sciezka, list(set(etykiety)))
# wyslij_signal(sciezka, list(set(etykiety)))
# wyslij_email(list(set(etykiety)))
| Cecha | Frigate NVR | Python + YOLOv8 |
|---|---|---|
| Trudność instalacji | Średnia (Docker) | Niska (jeden skrypt) |
| Interfejs webowy | ✅ Wbudowany | ❌ Brak (możesz dodać) |
| Nagrywanie ciągłe | ✅ Wbudowane | ⚠️ Trzeba dopisać |
| Integracja z HA | ✅ Natywna | ⚠️ Przez MQTT |
| Obsługiwanych kamer | Wiele jednocześnie | Jedna (rozszerzalne) |
| Zużycie RAM (Pi 4) | ~600 MB | ~300 MB |
| Szybkość detekcji (CPU) | ~3–5 kl/s | ~2–4 kl/s |
| Personalizacja | Przez YAML | Pełna (kod Python) |
| System lokalny (jednorazowo) | Ring/Nest (miesięcznie) | |
|---|---|---|
| Koszt rok 1 | ~500 zł (sprzęt) | ~360–720 zł abonament |
| Koszt rok 2+ | ~0 zł + prąd (~15 zł/m) | ~360–720 zł/rok |
| Prywatność | ✅ Dane tylko u Ciebie | ❌ Na serwerach korporacji |
| Działanie bez internetu | ✅ Tak | ❌ Nie |
Przy 2 latach użytkowania, system lokalny jest tańszy nawet uwzględniając koszt prądu (Pi 4 = ok. 5W = ~2 zł/miesiąc).