Tapo C200には、映像を取り出す公式の口と、設定・状態へ触る非公式の口がある。最初から全部をpytapoへ寄せず、映像=RTSP/ONVIF、設定と状態=pytapoに分けると、どこで壊れたかを切り分けやすい。
本稿は2026年8月20日に公式文書とpytapoの現行READMEを確認した手順で、ロボ図鑑では実機確認を終えていない。ファームウェアやハードウェア版で挙動が変わり得るため、実測済みとは扱わない。
先に用意するもの
- Tapoアプリへ登録済みのC200
- カメラと同じLANにいるPC
- Tapoアプリの
高度な設定 → カメラのアカウントで作る専用ユーザー名・パスワード - カメラのIPアドレス
- pytapoの現行READMEが前提にするPython 3.13環境
カメラ用アカウントはTP-Linkクラウドのログインとは別物である。公式FAQは6〜32文字で作成するよう案内している。この資格情報は映像と制御の両方へ届くので、他サービスと使い回さない。ルーターのDHCP予約でカメラのIPを固定しておくと、再起動後に接続先が変わらない。
1. まず公式RTSPだけを確認する
高画質と低画質の口は次の2本である。認証情報はURLへ埋め込まず、プレイヤー側の認証欄に入力した方が、シェル履歴やログへ残りにくい。
rtsp://<camera-ip>/stream1
rtsp://<camera-ip>/stream2
VLCやffprobeで映像が読めれば、ネットワーク・カメラアカウント・映像配信は成立している。ONVIFクライアントでも同じカメラアカウントとIPを使える。TP-Link公式FAQは、第三者ソフト経由ではパン・チルト操作を保証しないと明記している。RTSP/ONVIFで映像が見えたことを、首振り制御まで使える証拠にしない。
外から見るためにTCP 554をインターネットへ直接開ける構成は避ける。必要ならVPN経由でLANへ入る。microSDカードとTapo Careを同時利用している構成ではRTSPを使えない場合がある、という公式注意も先に確認する。
2. pytapoは読取から始める
現行READMEの最小例は、カメラ用アカウントとIPでクライアントを作り、基本情報を取得する形である。
python3.13 -m venv .venv
source .venv/bin/activate
python -m pip install pytapo
from pytapo import Tapo
camera = Tapo(
"192.168.1.52",
"<camera-account-user>",
"<camera-account-password>",
)
print(camera.getBasicInfo())
最初の完了条件は、例外なく基本情報が返ることだけにする。認証方式は機種・ファームウェアで異なるとpytapo自身が明記している。カメラ用アカウントで認証できない場合に限り、READMEの代替として admin とTP-Linkクラウドパスワードの組み合わせを確認する。ただしクラウドパスワードをコードへ直書きしない。
3. AIへ渡す道具は読取と操作を分ける
LLMへ最初に渡すツールは、get_basic_infoのような読取だけでよい。戻り値から機種・ファームウェア・状態を確認できた後に、必要な操作だけを個別に許可する。
get_camera_info() # 読取
get_stream_endpoint() # 読取
set_privacy_mode(...) # 操作・確認必須
pan_tilt(...) # 物理操作・確認必須
reboot_camera() # 復旧操作・確認必須
pytapoは非公式ライブラリで、テスト実行中に首振り、プライバシーモード変更、再起動などが起こり得るとREADME自身が警告している。関数一覧をそのままLLMへ公開せず、自分が用途を説明できる操作だけをallowlistにする。 カメラの撮影範囲、マイク、保存先、同居人・近隣のプライバシーも物理的な安全条件に含める。
完了判定
- 同一LANからRTSPのstream1またはstream2を読める
- pytapoの
getBasicInfo()が返る - 資格情報がコード、URL、ログへ露出していない
- AIへ渡したツールは読取と操作が分離されている
- 首振り・プライバシーモード・再起動は確認付きでしか呼べない
機種の接続性と映像をLLMへ渡す構成はTapo C200の標本とカメラ×LLMレシピも参照。