🐈

【猫監視システムへの道】4.Tapo C210のプライバシーモードを制御したい

2023/09/03に公開

この記事で実現すること

  • Python3でTapo C210のプライバシーモードの値を取得する。
  • Python3でTapo C210を、PCからプライバシーモードのON/OFF切換を行う。

まず、Onvifのサービス一覧を見ましたが、
こちらにプライバシーモード(プライベートモード)等に関するサービスを見つけられませんでした。

ネットで検索しても情報が出てきません。
python-onvifpytapoについても調べ、
結果として、pytapoライブラリでプライバシーモードのON/OFFを実現できました。

おそらくTapo C200やC310などといった他のカメラでも、同じように実現できると思います。

事前準備

pip install pytapo==3.2

プライバシーモード値の取得

pytapo_test.py
import json

from pytapo import Tapo

# 設定
TP_LINK_USER   = 'admin'      # ここは固定
TP_LINK_PASS   = 'TP-Linkのパスワード'
CAM_ADDR       = 'カメラのIPアドレス'

# 接続
tapo = Tapo(CAM_ADDR, TP_LINK_USER, TP_LINK_PASS)

# プライバシーモード値の取得
print(json.dumps(tapo.getPrivacyMode(), sort_keys=True, indent=2))
実行結果:
{
  ".name": "lens_mask_info",
  ".type": "lens_mask_info",
  "enabled": "on"
}

Tapoアプリでプライバシーモードを変更して、on/offになることを確認しました。

プライバシーモード値の切換

ON→OFF, OFF→ONにするだけのシンプルなソースコードです。

pytapo_test.py
import json
import time

from pytapo import Tapo

# 設定
TP_LINK_USER   = 'admin'      # ここは固定
TP_LINK_PASS   = 'TP-Linkのパスワード'
CAM_ADDR       = 'カメラのIPアドレス'

# 接続
tapo = Tapo(CAM_ADDR, TP_LINK_USER, TP_LINK_PASS)

print('現在のプライバシーモード値')
json_object = tapo.getPrivacyMode()
p_mode = json_object['enabled']
print(p_mode)

# プライバシーモードを切り替える
if p_mode == 'off':
    tapo.setPrivacyMode(True)
else:
    tapo.setPrivacyMode(False)
time.sleep(3)

print('現在のプライバシーモード値')
json_object = tapo.getPrivacyMode()
p_mode = json_object['enabled']
print(p_mode)
実行結果
現在のプライバシーモード値
off
現在のプライバシーモード値
on

おまけ1:pytapoでPan/Tilt操作を行う

記事3でPan/Tiltを実現しましたが、pytapoでも実現できました。

pytapo_test.py
  :
result = tapo.moveMotor(10, 20)
if result['error_code'] != 0:
    print('error')

moveMotor()がRelative Moveに相当するようです。
Absolute Move, Continuous Moveに相当する関数(使い方)は分かりませんでした。

一応下記関数も試しましたが、期待した動きをしませんでした。

  • moveMotorClockWise()
  • moveMotorCounterClockWise()
  • moveMotorHorizontal()
  • moveMotorVertical()
  • moveMotorStep()

下記を見ると、これら5つの関数はAbsolute Moveのように見えます。

Lib\site-packages\pytapo\__init__.py
    # todo child
    def moveMotor(self, x, y):
        return self.performRequest(
            {"method": "do", "motor": {"move": {"x_coord": str(x), "y_coord": str(y)}}}
        )

    # todo child
    def moveMotorStep(self, angle):
        if not (0 <= angle < 360):
            raise Exception("Angle must be in a range 0 <= angle < 360")

        return self.performRequest(
            {"method": "do", "motor": {"movestep": {"direction": str(angle)}}}
        )

    def moveMotorClockWise(self):
        return self.moveMotorStep(0)

    def moveMotorCounterClockWise(self):
        return self.moveMotorStep(180)

    def moveMotorVertical(self):
        return self.moveMotorStep(90)

    def moveMotorHorizontal(self):
        return self.moveMotorStep(270)

    # todo child
    def calibrateMotor(self):
        return self.performRequest({"method": "do", "motor": {"manual_cali": ""}})

ただ、水平と垂直でどちらもmoveMotorStep()を使うのが、腑に落ちません。
私の環境だと、moveMotorVertical()関数で上方向、
moveMotorHorizontal()関数で下方向に移動しました。

検索してもpytapoの開発者が提供しているサンプルプログラムしかヒットせず、
Pan/Tiltについては記事3ですでに実現できているので、
pytapo版の深追いはしないでおきます。

おまけ2:pytapoの関数一覧

pytapoの関数一覧は下記のように取得しました。

tapo = Tapo(CAM_ADDR, TP_LINK_USER, TP_LINK_PASS)
for _ in dir(tapo):
    print(_)

いろんなことができそうです。

basicInfo
calibrateMotor
childID
cloudPassword
deletePreset
ensureAuthenticated
executeFunction
format
getAlarm
getAlarmConfig
getAudioSpec
getAutoTrackTarget
getBabyCryDetection
getBarkDetection
getBasicInfo
getChildDevices
getCommonImage
getCruise
getDayNightMode
getErrorMessage
getEvents
getFirmwareUpdateStatus
getForceWhitelampState
getGlassBreakDetection
getHostURL
getImageFlipVertical
getLED
getLensDistortionCorrection
getLightFrequencyMode
getMediaEncrypt
getMediaSession
getMeowDetection
getModuleSpec
getMost
getMotionDetection
getMotorCapability
getNightVisionModeConfig
getOsd
getPersonDetection
getPetDetection
getPresets
getPrivacyMode
getRecordings
getRecordingsList
getRotationStatus
getStreamURL
getTamperDetection
getTime
getTimeCorrection
getUserID
getVehicleDetection
getVhttpd
hashedCloudPassword
hashedPassword
headers
host
isSupportingPresets
isUpdateAvailable
moveMotor
moveMotorClockWise
moveMotorCounterClockWise
moveMotorHorizontal
moveMotorStep
moveMotorVertical
password
performRequest
presets
reboot
refreshStok
responseIsOK
savePreset
session
setAlarm
setAutoTrackTarget
setBabyCryDetection
setBarkDetection
setCruise
setDayNightMode
setForceWhitelampState
setGlassBreakDetection
setImageFlipVertical
setLEDEnabled
setLensDistortionCorrection
setLightFrequencyMode
setMediaEncrypt
setMeowDetection
setMotionDetection
setNightVisionModeConfig
setOsd
setPersonDetection
setPetDetection
setPreset
setPrivacyMode
setRotationStatus
setTamperDetection
setVehicleDetection
startFirmwareUpgrade
startManualAlarm
stok
stopManualAlarm
superSecretKey
timeCorrection
user
userID

この記事を書いている時点ではまだ使っていませんが、
getPetDetectionが犬・猫兼用の検知機能、
getMeowDetectionが猫の泣き声検知機能のようなので気になっています。

参考サイト

Discussion