# Tapo Camera Monitor

Сервис мониторинга камер TP-Link Tapo C520WS / C320WS на Ubuntu VM.
Отслеживает события (движение, человек, транспорт), скачивает клипы с SD-карты,
анализирует через Gemini 2.5 Flash, отправляет в Telegram.

---

## Архитектура

```
Камера (SD-карта)
    │ pytapo (polling + download)
    ▼
camera.py ──► video.py (FFmpeg trim 10s)
                    │
                    ▼
              vision.py (Gemini 2.5 Flash)
                    │
                    ▼
              notifier.py (Telegram Bot API)
```

---

## Важно: пароль камеры

**pytapo использует локальный пароль устройства, а не пароль Tapo-аккаунта.**

Как найти/установить локальный пароль:
1. Откройте приложение Tapo на телефоне
2. Зайдите в настройки камеры → **Дополнительные настройки** → **Управление устройством**
3. Найдите раздел **Учётная запись камеры** (Camera Account) — там логин `admin` и пароль
4. Если пароль не задан — установите его там же

Этот пароль указывается в `config.yaml` → `cameras[].password`.

---

## Быстрый старт

### 1. Зависимости системы

```bash
sudo apt update
sudo apt install -y python3.11 python3.11-venv python3-pip ffmpeg
```

### 2. Установка

```bash
git clone <repo> tapo-monitor
cd tapo-monitor

python3.11 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```

### 3. Конфигурация

```bash
cp config.example.yaml config.yaml
nano config.yaml           # прописать IP, имена, пароли камер

cp .env.example .env
nano .env                  # TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID, GEMINI_API_KEY
```

#### Получить TELEGRAM_CHAT_ID
Напишите `/start` боту `@userinfobot` или `@getidsbot` в Telegram.
Для группы/канала — добавьте бота в чат и используйте отрицательный ID.

#### Получить GEMINI_API_KEY
Зарегистрируйтесь на [Google AI Studio](https://aistudio.google.com/apikey) → Create API Key.

### 4. Тест запуска

```bash
source .venv/bin/activate
TAPO_CONFIG=config.yaml python main.py
```

---

## Деплой через systemd

### Создание директорий

```bash
sudo mkdir -p /var/lib/tapo-monitor    # DB для дедупликации
sudo chown $USER:$USER /var/lib/tapo-monitor
```

### Копирование проекта

```bash
sudo cp -r tapo-monitor /opt/tapo-monitor
sudo chown -R tapo:tapo /opt/tapo-monitor   # или ваш пользователь
```

### Unit-файл `/etc/systemd/system/tapo-monitor.service`

```ini
[Unit]
Description=Tapo Camera Monitor
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=YOUR_USER
WorkingDirectory=/opt/tapo-monitor
Environment=TAPO_CONFIG=/opt/tapo-monitor/config.yaml
EnvironmentFile=/opt/tapo-monitor/.env
ExecStart=/opt/tapo-monitor/.venv/bin/python main.py
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
KillSignal=SIGTERM
TimeoutStopSec=30

[Install]
WantedBy=multi-user.target
```

### Активация

```bash
sudo systemctl daemon-reload
sudo systemctl enable tapo-monitor
sudo systemctl start tapo-monitor
sudo systemctl status tapo-monitor
```

### Логи

```bash
journalctl -u tapo-monitor -f
```

---

## Структура конфига

```yaml
polling_interval: 10      # секунды между опросами

cameras:
  - name: "Фронт"          # отображается в Telegram
    ip: "192.168.1.101"
    password: "localpass"  # локальный пароль камеры (не Tapo-аккаунт!)
    enabled: true

temp_dir: "/tmp/tapo-monitor"
events_db: "/var/lib/tapo-monitor/events.db"

clip:
  before_sec: 3   # секунды до события
  after_sec: 7    # секунды после события
```

---

## Переменные окружения (.env)

| Переменная | Описание |
|---|---|
| `TELEGRAM_BOT_TOKEN` | Токен от @BotFather |
| `TELEGRAM_CHAT_ID` | ID чата/группы/канала |
| `GEMINI_API_KEY` | Google AI Studio API ключ |

---

## Дедупликация событий

События хранятся в SQLite (`events_db`). Каждое событие помечается как обработанное
до начала скачивания — повторная обработка невозможна даже при перезапуске.
Записи старше 7 дней удаляются автоматически.

---

## Известные ограничения / открытые вопросы

1. **API pytapo нестабильно** — библиотека активно меняется. Если `getRecordings()`
   не работает с вашей прошивкой — проверьте актуальную версию и issues на GitHub.
   Возможно, потребуется адаптация `camera.py` под конкретный метод API.

2. **Смещение события внутри клипа** — камера может писать клипы по 1–5 минут.
   Текущая логика вычисляет `offset = event_time - clip_start_time`. Если pytapo
   возвращает клип целиком (не сегментированный по событию), это работает корректно.
   Если клип уже нарезан по событию — установите `before_sec: 0` и `after_sec: 10`.

3. **Timezone** — камеры отдают время в UTC или локальном времени в зависимости
   от настроек. Проверьте логи и при необходимости добавьте `tzinfo` в `camera.py`.

4. **Gemini 2.5 Flash** — используется preview-модель `gemini-2.5-flash-preview-04-17`.
   При GA-релизе обновите название модели в `vision.py`.

5. **Размер видео** — Telegram ограничивает размер файла 50 МБ через Bot API.
   Для больших клипов увеличьте CRF в `video.py` или уменьшите разрешение.
