Je me réponds à moi-même pour ceux qui rencontreraient le même problème. La solution est donnée pour HA sur ce forum : https://github.com/petretiandrea/home-assistant-tapo-p100/issues/958.
Résumé de la cause du problème
Lors d’un redémarrage complet (coupure de courant ou débranchement), la prise Tapo P110 se reconnecte au Wi-Fi et au cloud en quelques secondes, mais son API locale (sur le port TCP 80) ne se lance pas au démarrage.
TP-Link utilise une initialisation dite « lazy » (paresseuse) pour économiser les ressources de la prise : l’API locale reste éteinte tant que la prise ne reçoit pas une trame de découverte spécifique (un paquet UDP/TDP envoyé sur le port 20002).
-
Sans cette trame, l’API locale met entre 8 et 9 minutes à s’activer d’elle-même (le port 80 renvoie une erreur Connection Refused).
-
L’application mobile Tapo envoie cette trame automatiquement quand on la lance (ce qui réactivait l’API).
-
La solution : Envoyer manuellement ce paquet UDP d’activation à la prise dès son redémarrage (ou à intervalle régulier / au lancement du démon) pour ouvrir immédiatement le port 80.
[Tuto] Corriger la perte de contrôle des prises Tapo (P110…) après une coupure de courant / redémarrage
Voici comment créer un script Python pour forcer le réveil immédiat de l’API locale de la prise.
Étape 1 : Créer le fichier Python dans le plugin Script
Attention particulière au plugin Script : Si vous nommez votre fichier avec l’extension .py (ex: tapo_wake.py), Jeedom l’exécutera par défaut avec Python 2. Pour forcer l’utilisation de Python 3 via le shebang (#!/usr/bin/env python3), il faut impérativement créer un fichier SANS extension.
-
Rendez-vous dans Plugins > Programmation > Script.
-
Cliquez sur Ajouter (nommez l’équipement par exemple Réveil Tapo).
-
Dans l’équipement, cliquez sur le bouton Fichier(s) en haut à droite pour ouvrir l’éditeur de fichiers.
-
Cliquez sur Nouveau fichier et nommez-le simplement tapo_wake (sans .py à la fin).
-
Collez le code Python 3 suivant dans le fichier :
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
import struct
import json
import binascii
import secrets
import sys
# Vérification de l'argument IP
if len(sys.argv) < 2:
print("Erreur : L'adresse IP de la prise est requise en argument.")
sys.exit(1)
ip_target = sys.argv[1]
RSA_PEM = "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3/...\n-----END PUBLIC KEY-----\n"
def build_probe():
p = json.dumps({"params": {"rsa_key": RSA_PEM}}).encode()
h = struct.pack(">BBHHBBII", 2, 0, 1, len(p), 17, 0,
int.from_bytes(secrets.token_bytes(4), "big"), 0x5A6B7C8D)
q = bytearray(h + p)
q[12:16] = binascii.crc32(bytes(q)).to_bytes(4, "big")
return bytes(q)
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.settimeout(2)
probe_packet = build_probe()
# Envoie 3 paquets de réveil pour s'assurer de la réception UDP
for _ in range(3):
s.sendto(probe_packet, (ip_target, 20002))
print(f"Trame de réveil Tapo envoyée avec succès à {ip_target}")
s.close()
except Exception as e:
print(f"Erreur lors de l'envoi : {e}")
sys.exit(1)
- Sauvegardez le fichier et fermez l’éditeur.
Étape 2 : Configurer la commande dans le plugin Script
-
Dans votre équipement Script, allez dans l’onglet Commandes.
-
Cliquez sur Ajouter une commande script.
-
Renseignez les champs suivants :
-
Nom : Réveiller P110 (ou le nom de votre prise)
-
Type : Action / Défaut
-
Recherche / Fichier : Cliquez sur le bouton pour sélectionner le fichier tapo_wake créé précédemment.
-
Options : Ajoutez l’adresse IP de votre prise après le nom du fichier séparé par un espace.
- Exemple dans le champ Fichier/Commande :
/var/www/html/plugins/script/data/tapo_wake 192.168.1.50
-
Sauvegardez l’équipement. Vous pouvez tester la commande en cliquant sur Tester.
Étape 3 : Automatisation par Scénario (Réveil automatique sur perte de connexion)
Pour que Jeedom relance le port 80 de la prise de manière totalement autonome dès qu’elle devient injoignable :
1. Prérequis : Activer le Ping sur le Routeur
Afin de vérifier que le logement a bien du courant, assurez-vous d’avoir votre box/routeur (ou votre serveur Home/Raspberry Pi) intégré dans Jeedom via le plugin Network (Ping).
- Admettons que l’état du ping de votre routeur soit représenté par la commande :
#[Réseau][Routeur][Statut]# (1 si en ligne, 0 si hors ligne).
2. Création du Scénario dans Jeedom
-
Allez dans Outils > Scénarios et cliquez sur Ajouter.
-
Nommez le scénario (ex : [Tapo] Auto-Réveil P110).
-
Dans l’onglet Scénario :
-
Dans l’onglet Enchaînement / SI-ALORS-SINON : Ajoutez un bloc SI avec la condition suivante :
#[Réseau][Ping Tapo P110][Statut]# == 1 ET #[Maison][P110][Connecté]# ==-3 (La prise vient TOUT JUSTE de se rallumer, de choper son IP et le port 80 est fermé)
(Remplacez les noms des commandes par les vôtres via le sélecteur Jeedom).
-
Dans le bloc ALORS :
Voilà pour le workaround. A voir si ça ne peut pas être intégré au plugin wifilightV2