[TUTO] piloter une caméra Tp-link Tapo

okay merci

Bonjour,

J’ai suivi votre tuto mais dès la première exécution du script j’ai un message d’erreur. Avez vous une idée de ce qui cause ce problème?

Erreur sur /var/www/html/plugins/script/data/moveX.PY 10 2>&1 valeur retournée : 1. Détails : Traceback (most recent call last): File « /var/www/html/plugins/script/data/moveX.PY », line 3, in from pytapo import Tapo File « /usr/local/lib/python3.7/dist-packages/pytapo/init.py », line 12, in from .media_stream.session import HttpMediaSession File « /usr/local/lib/python3.7/dist-packages/pytapo/media_stream/session.py », line 13, in from pytapo.media_stream._utils import ( File « /usr/local/lib/python3.7/dist-packages/pytapo/media_stream/_utils.py », line 45 if i := b.find(sep, start_index) != -1: ^ SyntaxError: invalid syntax

Bonjour, j’ai le même problème, a-t-il été résolut ?

Merci

Pour l’instant, problème toujours pas résolu, ne connaissant pas le langage python je n’arrive pas à résoudre l’erreur de syntaxe.

En ssh le problème qui est pointé plus précisément est le := de la ligne 45 dans _utils.py.

Je n’ai pas regardé mais dans tous les cas il y a un problème de parenthèses (comme en langage C&co) donc pour respecter la variable par rapport au test ce serait plutôt :

if (i := b.find(sep, start_index)) != -1:

à la place de :

if i := b.find(sep, start_index) != -1:

Je viens de regarder, et visiblement, je n’ai pas le même fichier utils.py

Le mien contient

import hashlib
import os

from typing import Mapping, Tuple, Optional


def md5digest(to_hash: bytes) -> bytes:
    return hashlib.md5(to_hash).digest().hex().upper().encode()


def generate_nonce(length: int) -> bytes:
    return os.urandom(length).hex().encode()


def parse_http_headers(data: bytes) -> Mapping[str, str]:
    return {
        i[0].strip(): i[1].strip()
        for i in (j.split(":", 1) for j in data.decode().strip().split("\r\n"))
    }


def parse_http_response(res_line: bytes) -> Tuple[bytes, int, Optional[bytes]]:
    http_ver, status_code_and_status = res_line.split(b" ", 1)
    if b" " in status_code_and_status:
        status_code, status = status_code_and_status.split(b" ", 1)
    else:
        status_code = status_code_and_status
        status = None
    return http_ver, int(status_code.decode()), status

Un problème de versions entre la version installée et celle de l’ordi ? lors de la commande d’installation

sudo python3 -m pip install pytapo

Pour info, voici le contenu dui répertoire ::/usr/local/lib/python3.7/dist-packages/pytapo/media_stream
crypto.py error.py __init__.py __pycache__ response.py session.py _utils.py

Je viens de regarder j’ai ajouté les parenthèses mais toujours la même ligne en erreur de syntaxe.

En ce qui concerne les fichiers, j’ai relancer la commande d’installation et voici le log


Requirement already satisfied: pytapo in /usr/local/lib/python3.7/dist-packages (3.2.14)
Requirement already satisfied: requests in /usr/local/lib/python3.7/dist-packages (from pytapo) (2.31.0)
Requirement already satisfied: urllib3 in /usr/local/lib/python3.7/dist-packages (from pytapo) (2.0.6)
Requirement already satisfied: rtp in /usr/local/lib/python3.7/dist-packages (from pytapo) (0.0.3)
Requirement already satisfied: pycryptodome in /usr/local/lib/python3.7/dist-packages (from pytapo) (3.19.0)
Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.7/dist-packages (from requests->pytapo) (3.3.0)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests->pytapo) (2023.7.22)
Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests->pytapo) (3.4)
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
[notice] A new release of pip available: 22.3.1 -> 23.3.1
[notice] To update, run: python3 -m pip install --upgrade pip

et le fichier _utils.py comporte le texte suivant

import hashlib
import os

from typing import Mapping, Tuple, Optional


def md5digest(to_hash: bytes) -> bytes:
    return hashlib.md5(to_hash).digest().hex().upper().encode()


def generate_nonce(length: int) -> bytes:
    return os.urandom(length).hex().encode()


def parse_http_headers(data: bytes) -> Mapping[str, str]:
    return {
        i[0].strip(): i[1].strip()
        for i in (j.split(":", 1) for j in data.decode().strip().split("\r\n"))
    }


def parse_http_response(res_line: bytes) -> Tuple[bytes, int, Optional[bytes]]:
    http_ver, status_code_and_status = res_line.split(b" ", 1)
    if b" " in status_code_and_status:
        status_code, status = status_code_and_status.split(b" ", 1)
    else:
        status_code = status_code_and_status
        status = None
    return http_ver, int(status_code.decode()), status


def parse_time(b: bytes) -> int:
    return (
        ((b[0] & 0x0E) << 29)
        | (b[1] << 22)
        | ((b[2] & 0xFE) << 14)
        | (b[3] << 7)
        | (b[4] >> 1)
    )


def index_from(b: bytes, sep: bytes, start_index: int) -> int:
    if start_index > 0:
        if start_index < len(b):
            if (i := b.find(sep, start_index)) != -1:
                return i
        return -1
    return b.find(sep)


# todo: is this function correct???
def annexB2AVC(b):
    b = bytes(b)
    i = 0
    # f = open("data1.txt", "w")
    # f.write(str(list(b)))
    # f.close()
    while i < len(b):
        if i + 4 >= len(b):
            break

        size = b[i + 4 :].find(b"\x00\x00\x00\x01")

        # f = open("data1.5.txt", "w")
        # f.write(str(list(b[i + 4 :])))
        # f.close()

        if size < 0:
            size = len(b) - (i + 4)

        size_bytes = size.to_bytes(4, "big")

        b = bytearray(b)
        b[i : i + 4] = size_bytes
        b = bytes(b)

        i += size + 4
    # f = open("data2.txt", "w")
    # f.write(str(list(b)))
    # f.close()
    # sys.exit(0)

    return bytearray(b)

On a visiblement pas les mêmes fichiers. Sans doute pas la même version de pytapo.
Là, pas trop le temps, mais je pourrais te passer les fichiers qui sont sur mon ordi. Si tu arrives à en avoir la liste… Mais jamais évident avec les dépendances.

Mon tuto date du 5 février 2022. Mon installation sur mon poste date donc d’avant.
Sur ce site

tu peux trouver les anciennes versions.

logiquement, il faudrait que tu charges la version 1.2.1

ou plus précisement

Les spécialiste linux devront te dire si tu dois désinstaller la version actuelle ou pas avant de la charger.

Merci pour tes réponses, j’ai désinstallé la version la plus récente et forcé l’installation de la version 1.2.1 grâce à la commande python3 -m pip install pytapo==1.2.1
voici le résultat de la commande

Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: pytapo==1.2.1 in /var/www/.local/lib/python3.7/site-packages (1.2.1)
Requirement already satisfied: urllib3 in /usr/local/lib/python3.7/dist-packages (from pytapo==1.2.1) (2.0.6)
Requirement already satisfied: requests in /usr/local/lib/python3.7/dist-packages (from pytapo==1.2.1) (2.31.0)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests->pytapo==1.2.1) (2023.7.22)
Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests->pytapo==1.2.1) (3.4)
Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.7/dist-packages (from requests->pytapo==1.2.1) (3.3.0)

[notice] A new release of pip available: 22.3.1 -> 23.3.1
[notice] To update, run: python3 -m pip install --upgrade pip

Mais malheureusement au moment d’exécuter le script j’ai encore un message d’erreur m’indiquant un problème d’authentification, j’ai bien vérifié les informations de connexion. Je penche sur une modification du firmware par le fabricant des cameras modifiant la manière de s’identifier (d’où les nouvelle version de pytapo)… Le firmware actuel est le 1.3.7 build 230920 de ma c210.

Je ne sais plus trop quoi faire.

Merci pour ce super tuto.
J’ai 2 C210 et j’essaie de les configurer via des scripts jeedom grâce à vous.
Mais je bloque sur « Exception: Invalid authentication data ».
J’ai essayé le login password de la caméra, le login password du compte, …
Tu précises dans ton intro : " Pour la C210, il faut utiliser le login « admin » et le « mot de passe du compte TPLINK " (le compte principal) » c’est à dire le mot de passe de l’appli tapo ?
Merci pour votre aide.
Traces au cas où :

[2023-11-23 20:34:41][ERROR] : Erreur exécution de la commande [Intranet][active_cameras_interieur][SetPrivacyModeFalse] : Erreur sur /var/www/html/plugins/script/data/SetPrivacyMode.PY False 2>&1 valeur retournée : 1. Détails : Traceback (most recent call last): File "/var/www/html/plugins/script/data/SetPrivacyMode.PY", line 14, in <module> SetPrivacyMode(sys.argv[1]) File "/var/www/html/plugins/script/data/SetPrivacyMode.PY", line 11, in SetPrivacyMode tapo=Tapo(host,user,password) File "/usr/local/lib/python3.7/dist-packages/pytapo/__init__.py", line 34, in __init__ self.basicInfo = self.getBasicInfo() File "/usr/local/lib/python3.7/dist-packages/pytapo/__init__.py", line 221, in getBasicInfo {"method": "get", "device_info": {"name": ["basic_info"]}} File "/usr/local/lib/python3.7/dist-packages/pytapo/__init__.py", line 85, in performRequest self.ensureAuthenticated() File "/usr/local/lib/python3.7/dist-packages/pytapo/__init__.py", line 51, in ensureAuthenticated return self.refreshStok() File "/usr/local/lib/python3.7/dist-packages/pytapo/__init__.py", line 70, in refreshStok raise Exception("Invalid authentication data") Exception: Invalid authentication data

Avec pytapo 1.2.1 j’ai cette erreur d’authentification line 51, in ensureAuthenticated return self.refreshStok() File "/usr/local/lib/python3.7/dist-packages/pytapo/__init__.py", line 70, in refreshStok raise Exception("Invalid authentication data") Exception: Invalid authentication data

Avec pytapo 3.3.18 j’ai cette erreur : line 13, in from pytapo.media_stream._utils import ( File "/usr/local/lib/python3.7/dist-packages/pytapo/media_stream/_utils.py", line 45 if i:=b.find(sep, start_index) != -1: ^ SyntaxError: invalid syntax

Je suis repassé sur pytapo 3.3.18 et j’ai maintenant également une erreur d’authentification, j’ai ouvert une issue sur github, je pense qu’il y a un soucis lié à la cam C210 et à son firmware.
Je reviens ici dès que j’ai plus de news si ça peut en aider d’autres.

Le développeur de pytapo m’indique que la version de Python3 à savoir la 3.7 est trop ancienne pour fonctionner avec pytapo 3.3.18, il faudrait passer sur python 3.9 est-ce que c’est possible sur la box jeedom smart ?

C’est enfin fonctionnel pour 2 caméras C210 en firmware 1.3.11 il faut :

  • installer pytapo dernière version aujourd’hui 3.3.18
  • installer python récent j’ai installé python 3.9
  • si C210 alors le user est « admin » et le password est « le password du compte tapo »

Et ça fonctionne merci pour ce tuto, et merci au créateur de pytapo.

1 « J'aime »

Bonjour.
J’ai une camera C210
Je suis une bille car je n’arrive pas a comprendre le tuto , j’ai lu plusieurs post mais je m’embrouille . du coup j’ai de essayer des choses mais ça ne fonctionne pas, j’ai des erreurs comme ça :

.
Je n’ose pas aller plus loin car j’ai peur de faire des betises.
J’ai une une Atlas.voici la page santé ( si ça peut aider):

Il y aurait’il une personne qui aurait la patience de m’aider ?

Bonjour à tous,

J’ai un problème avec avec le scripts, tout fonctionnait bien et puis depuis quelques jours ça, je ne peux plus piloter ma caméra une tapo C200.

J’ai désinstaller puis réinstaller pytapo mais cela n’a pas résolu mon problème, juste changé l’erreur.

Voici l’erreur que j’ai

Erreur exécution de la commande [Scénario][Caméra positions][Defaut] : Erreur sur /var/www/html/plugins/script/data/tapo_defaut.PY 2>&1 valeur retournée : 1. Détails : Traceback (most recent call last): File « /var/www/html/plugins/script/data/tapo_defaut.PY », line 9, in tapo = Tapo(host,user, password) File « /usr/local/lib/python3.9/dist-packages/pytapo/init.py », line 86, in init self.basicInfo = self.getBasicInfo() File « /usr/local/lib/python3.9/dist-packages/pytapo/init.py », line 1009, in getBasicInfo return self.executeFunction( File « /usr/local/lib/python3.9/dist-packages/pytapo/init.py », line 491, in executeFunction data = self.performRequest( File « /usr/local/lib/python3.9/dist-packages/pytapo/init.py », line 530, in performRequest self.ensureAuthenticated() File « /usr/local/lib/python3.9/dist-packages/pytapo/init.py », line 108, in ensureAuthenticated return self.refreshStok() File « /usr/local/lib/python3.9/dist-packages/pytapo/init.py », line 400, in refreshStok raise Exception(« Invalid authentication data ») Exception: Invalid authentication data

En cherchant, je suis tombé sur cette page
https://github.com/JurajNyiri/pytapo qui indique que si l’on a cette erreur, il faut utiliser admin et le mot de passe du compte cloud mais ça n’a pas résolu mon problème.

EDIT: grace au message Pytoon et en reprenant tout à tête reposé j’ai trouvé la solution.
Pour ceux que ça pourrait aider, suite à la désinstallation de pytapo, j’ai mis à jour ma version de python. grace à ce lien https://linuxize.com/post/how-to-install-python-3-9-on-debian-10/
Puis modifier mes scritps avec admin au lieu de l’user que j’avais créer en local sur ma caméra et ça fonctionne.

Pour info à ceux qui voudrait suivre mon exemple, je ne sais quasiment pas ce que je fait, ma seule compétence c’est Google :sweat_smile: et une sauvegarde de ma VM qui me garanti que je peux faire tout mes test asser sereinement, je ne suis donc pas sur que ça soit la bonne manipulation mais ça a fonctionné pour moi.

1 « J'aime »

Bonjour
En parcourant d’autres posts j’ai lu que Python 3.9 etait incompatible avec debian 10.

Vu que moi, j’ai une box atlas avec debian 10 et python 2.7.16 ( d’ailleur je ne devrait pas etre au moins en version 3.7 ) apparement ça ne peut pas fonctionner.
A moins que je me trompe.
Du coup je remet la C210 au placard.

Bonjour à tous,
Merci pour cette discussion qui m’a bien aidé.
J’ai une jeedom smart en 4.3.21 et j’ai reçu du papa noël une caméra Tapo C310.

Je ne suis pas un as de la programmation, du coup j’essaie de me débrouiller avec mon petit cerveau et les forums plutôt bien fourni.

J’ai réussi à configurer ma caméra avec le plugin caméra, je récupère le flux vidéo mais je n’ai pas le son sur Jeedom, mais je l’ai sur VLC, si quelqu’un a une solution sur ce sujet.

Sinon après avoir tout configuré, je voulais récupérer la détection de mouvement, mais j’avoue que je ne comprends pas les scripts écrit plus haut, où trouver les bibliothèques, où mettre les scripts, etc… Du coup j’ai trouvé un plan B (pas terrible mais ça fonctionne).

J’ai utilisé IFTTT pour ça, j’ai connecté mon compte Tapo à IFTTT et dès qu’il y a une détection de mouvement, je reçois un message sur Télégram. J’ai fait l’applet suivant:

Ensuite j’ai utilisé un BOT sur Télégram qui s’appelle @Auto_Forward_Messages_Bot. J’ai utilisé celui la car il est gratuit pour mon besoin. Puis j’ai fait un transfère de mon bot Télégram IFTTT vers mon BOT Télégram Jeedom, et avec une interaction que j’ai configuré, je reçois une notification avec une image et une vidéo lorsque la caméra détecte un mouvement.

J’avoue ne pas être fan de ce système qui utilise IFTTT et aussi le BOT de Télégram. J’aurais préféré faire une requête HTTP via le webhooks sur IFTTT mais c’est payant et je n’ai pas envie de choisir cette option. Si quelqu’un a quelque-chose de mieux concernant la détection de mouvement je suis preneur ! (Merci d’avoir lu ce gros pavé).

Bonjour à tous,
J’aurais bien voulu piloter ma caméra, mais je n’y arrive pas, mon Jeedom est à jour dans la dernière version. J’ai bien installé :

  • installer pytapo dernière version aujourd’hui 3.3.18*
  • installer python récent j’ai installé python 3.9*
    et recopier les codes en faisant attention de ne pas avoir d’espace avant #.
    Mais j’ai un message d’erreur :
Erreur exécution de la commande [Aucun][Caméra 1 vue 1][Vue 1] : Erreur sur sudo chmod +x /var/www/html/plugins/script/data/posSelect1.py 2>/dev/null;python /var/www/html/plugins/script/data/posSelect1.py 2 2>&1 valeur retournée : 1. Détails : File "/var/www/html/plugins/script/data/posSelect1.py", line 12 SyntaxError: Non-ASCII character '\xc3' in file /var/www/html/plugins/script/data/posSelect1.py on line 12, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

Je ne vois pas ce que je fais de mauvais ??

Bonjour, ce serait pour être sûr si il n’y a pas de plugin Jeedom qui intègre pytapo ? ou si il y a un plugin qui arrivera.

pytapo débugué… tu peux les ressortir du placard :yum: (voir mon message dans le forum)