Files
wiki/tasks/tapo/tapo-monitor
2026-04-12 21:55:33 +03:00
..
2026-04-12 21:55:33 +03:00
2026-04-12 21:55:33 +03:00
2026-04-12 21:55:33 +03:00
2026-04-12 21:55:33 +03:00
2026-04-12 21:55:33 +03:00
2026-04-12 21:55:33 +03:00
2026-04-12 21:55:33 +03:00
2026-04-12 21:55:33 +03:00

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.yamlcameras[].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 дней удаляются автоматически.


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

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

  2. Смещение события внутри клипа — камера может писать клипы по 15 минут. Текущая логика вычисляет 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 или уменьшите разрешение.