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-аккаунта.
Как найти/установить локальный пароль:
- Откройте приложение Tapo на телефоне
- Зайдите в настройки камеры → Дополнительные настройки → Управление устройством
- Найдите раздел Учётная запись камеры (Camera Account) — там логин
adminи пароль - Если пароль не задан — установите его там же
Этот пароль указывается в config.yaml → cameras[].password.
Быстрый старт
1. Зависимости системы
sudo apt update
sudo apt install -y python3.11 python3.11-venv python3-pip ffmpeg
2. Установка
git clone <repo> tapo-monitor
cd tapo-monitor
python3.11 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
3. Конфигурация
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 → Create API Key.
4. Тест запуска
source .venv/bin/activate
TAPO_CONFIG=config.yaml python main.py
Деплой через systemd
Создание директорий
sudo mkdir -p /var/lib/tapo-monitor # DB для дедупликации
sudo chown $USER:$USER /var/lib/tapo-monitor
Копирование проекта
sudo cp -r tapo-monitor /opt/tapo-monitor
sudo chown -R tapo:tapo /opt/tapo-monitor # или ваш пользователь
Unit-файл /etc/systemd/system/tapo-monitor.service
[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
Активация
sudo systemctl daemon-reload
sudo systemctl enable tapo-monitor
sudo systemctl start tapo-monitor
sudo systemctl status tapo-monitor
Логи
journalctl -u tapo-monitor -f
Структура конфига
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 дней удаляются автоматически.
Известные ограничения / открытые вопросы
-
API pytapo нестабильно — библиотека активно меняется. Если
getRecordings()не работает с вашей прошивкой — проверьте актуальную версию и issues на GitHub. Возможно, потребуется адаптацияcamera.pyпод конкретный метод API. -
Смещение события внутри клипа — камера может писать клипы по 1–5 минут. Текущая логика вычисляет
offset = event_time - clip_start_time. Если pytapo возвращает клип целиком (не сегментированный по событию), это работает корректно. Если клип уже нарезан по событию — установитеbefore_sec: 0иafter_sec: 10. -
Timezone — камеры отдают время в UTC или локальном времени в зависимости от настроек. Проверьте логи и при необходимости добавьте
tzinfoвcamera.py. -
Gemini 2.5 Flash — используется preview-модель
gemini-2.5-flash-preview-04-17. При GA-релизе обновите название модели вvision.py. -
Размер видео — Telegram ограничивает размер файла 50 МБ через Bot API. Для больших клипов увеличьте CRF в
video.pyили уменьшите разрешение.