Trop bien !
Tu veux pas faire un plugin pytapo du coup ?
Il doit y avoir une erreur dans ton script car que je l’appelle avec on ou off en paramètre il ne fait qu’activer le mode privé.
J’ai essayé de changer on et off par True et False dans cette ligne
if param in ['on', 'off']:
et dans le paramètre de l’appel du script mais ça ne fonctionne pas non plus
En fait c’est très bizarre parce que ça fonctionne avec ce script sans argument (j’ai volontairement éludé les premières lignes):
def privacyOff() :
tapo2=Tapo(Info.host, Info.user, Info.password)
res=tapo2.setPrivacyMode(False)
return res
result=privacyOff()
print (result)
mais dès que je passe un argument et que je l’appelle comme ça /var/www/html/plugins/script/data/setprivacyOFF.PY False
ça ne marche pas:
def privacyOff(mode) :
tapo2=Tapo(Info.host, Info.user, Info.password)
res=tapo2.setPrivacyMode(mode)
return res
result=privacyOff(sys.argv[1])
print (result)
Hello
Si ca peut aider, voici le script que j’avais bricolé à une époque.
Il me servait surtout a déclencher la détection automatiquement lorsque je partais de chez moi( et inversement)
Puis après, j’ai eu un chat et j’ai laissé tombé la détection et j’ai laissé tombé le pilotage via jeedom.
C’était un seul script et je l’appelais avec des paramètres en fonction du besoin
#!/usr/bin/env python3
from pytapo import Tapo
import sys
# user="xxxx"
# password="xxxxxx"
user="MonUser"
password="MonPass"
host="192.168.x.xxx"
def move( X , Y ):
tapo=Tapo(host, user, password)
res ={}
try :
res = tapo.moveMotor( X , Y )
except :
print("Camera en butee (X ou Y)")
res["error_code"] =-1
if(res.get("error_code")==0) :
print( 1 )
else :
print( -1 )
def getAlarm():
tapo=Tapo(host, user, password)
print(tapo.getAlarm())
def getMotionDetection():
try:
tapo=Tapo(host,user,password)
res=tapo.getMotionDetection()
except Exception:
print("getMotionDetection KO")
else:
print(1 if res["enabled"] == "on" else 0)
def setMotionDetection(State):
tapo=Tapo(host, user, password)
try :
tapo.setMotionDetection(State)
except Exception :
print("setMotionDetection KO")
def getBasicInfo():
tapo=Tapo(host, user, password)
print(tapo.getBasicInfo())
def getLED():
tapo=Tapo(host, user, password)
res = tapo.getLED()
print( 1 if res["enabled"] == "on" else 0 )
def setLED(State):
tapo=Tapo(host, user, password)
res ={}
try :
res = tapo.setLEDEnabled(State)
except Exception :
print("setLED KO")
res["error_code"] =-1
if(res.get("error_code")==0) :
print( 1 )
else :
print( -1 )
def getPrivacyMode():
tapo=Tapo(host, user, password)
print(tapo.getPrivacyMode())
def getOsd():
tapo=Tapo(host, user, password)
print(tapo.getOsd())
def getModuleSpec():
tapo=Tapo(host, user, password)
print(tapo.getModuleSpec())
# ------- Appels des fonctions
if sys.argv[1] == "move":
move(sys.argv[2] , sys.argv[3] )
elif sys.argv[1] == "getAlarm":
getAlarm()
elif sys.argv[1] == "getMotionDetection":
getMotionDetection()
elif sys.argv[1] == "setMotionDetection":
setMotionDetection( True if sys.argv[2] == "true" else False )
elif sys.argv[1] == "getBasicInfo":
getBasicInfo()
elif sys.argv[1] == "getLED":
getLED()
elif sys.argv[1] == "setLED":
setLED( True if sys.argv[2] == "true" else False )
elif sys.argv[1] == "getPrivacyMode":
getPrivacyMode()
elif sys.argv[1] == "getOsd":
getOsd()
elif sys.argv[1] == "getModuleSpec":
getModuleSpec()
else:
print("sys.argv[1] inconnu")
print("fin test")
Et j’appelais ce script avec le plugin script
Exemple de commande :
/var/www/html/plugins/script/data/CamTapo.PY setLED true
/var/www/html/plugins/script/data/CamTapo.PY setLED false
/var/www/html/plugins/script/data/CamTapo.PY setMotionDetection true
/var/www/html/plugins/script/data/CamTapo.PY setMotionDetection false
/var/www/html/plugins/script/data/CamTapo.PY getMotionDetection
Ah ouais top, un seul script pour les gouverner tous ! J’y pensais justement.
Mais ça ne résoud pas mon problème, j’arrive toujours pas à appeler setPrivacyMode avec false en argument
L’argument False est pris comme une chaîne de caractères, c’est pour ça que je t’ai proposé on ou off en argument.
Je mise une pièce sur le fait que True/False en argument est un string et non un bool.
Regardes bien mon script qui ne passe pas directement par le true/false de l’argument.
Ce n’est pas la même fonction mais l’idée est la
elif sys.argv[1] == "setMotionDetection":
setMotionDetection( True if sys.argv[2] == "true" else False )
En effet mais ça ne fonctionnait pas non plus car la fonction demande true ou false en argument.
J’ai combiné ton code avec celui de @bodbod et ça fonctionne ! Merci à tous les deux .
if param in ["on", "off"]:
result=setPrivacy(True if param == "on" else False)
print (result)
else:
print("error")
Maintenant prochaine étape combiner tout ça dans un seul script !
Et voilà le code unique est fonctionnel, merci @bodbod ! En plus ça évite le fichier séparé pour renseigner les logins, c’est top !
C’etait bien le but de centraliser
Idéalement, il faudra implémenter le maximum des fonctions pytapo disponible et partager le script à la fin.
Pour ce qui est d’un plugin, j’avais bricolé un truc mais j’avais pas fini (un plugin qui appelait le script).
Mais en fouillant un peu, je pense qu’il faut un plugin avec un deamon python et le reste en PHP
Je te rejoins complément sur l’utilité d’un plugin mais tu auras bien compris que mes compétences sont très limitées sur le dev .
Peut-être faudrait-il faire une annonce dans la catégorie Suggestions de plugins ?
J’en ai implémenté quelques unes de plus que j’utilise, il faudra que je copie le script ici (sur mobile je galère).
J’ai une question avec la fonction pytapo getNotificationsEnabled
: elle renvoie un string de type : {'notification_enabled': 'on', 'rich_notification_enabled': 'on'}
et du coup je me dis qu’il vaudrait mieux dans notre script qu’on divise le résultat en une fonction getAllNotificationsEnabled
et une autre getRichNotificationsEnabled
mais je ne sais pas trop comment faire, ni si c’est judicieux.
Votre avis ?
Dans un premier temps il faut comprendre la différence entre les deux puis savoir si tu a besoin de l’une et/ou l’autre
Ça correspond à ces deux types de notifications envoyées par l’appli Tapo (le second ne peut être activé sans le premier).
Maintenant que tu le dis, c’est pas forcément cohérent de les utiliser/monitorer avec jeedom puisque le but ultime est de se passer de l’appli . Mais en même temps il me semble qu’on a pas encore trouvé le moyen de remonter en direct les alertes d’activité détectée par la caméra…
Dans la mesure où chaque exécution de script ne revoit qu’une valeur (print), cela sous entend qu’il faut deux commandes qui font le même appel
Mais dans un cas le print se fait sur la première valeur, dans le 2e cas, la deuxième valeur.
Il existe la lib Json qui permet de simplifier la lecture de ton Json
J’ai réussi .
En utilisant :
res=tapo.getNotificationsEnabled()
print(res["notification_enabled"])
et dans une deuxième fonction
res=tapo.getNotificationsEnabled()
print(res["rich_notification_enabled"])
ça permet de récupérer les deux statuts séparément.
Merci à toi, je progresse doucement !
Bon bah je commence à avoir un script bien conséquent
J’y vais à petits pas avec les fonctions que j’utilise et que je connais.
Ça donne ça côté tuile (pas du tout optimisée !)
:
Avec des toggles qui lient les commandes get/set adéquates, des listes quand le choix est autre que on/off, et une subtilité pour la liste des presets ) :je modifie la chaîne renvoyée par la fonction getPresets() pour la reformater dans la syntaxe attendue pour une liste (id1|valeur1; etc…) et un bloc code en parallèle copie cette chaîne dans la commande action setPresets pour que la liste soit dynamique (voir ce post).
Il faut encore que je vois comment je traite getFirmwareUpdateStatus, a priori c’est pas très utile sauf si update en cours (ou récent ?). Et que je vois comment faire pour que le bouton StartUpgradeStatus ne s’affiche que si isUpdateAvailable est différent de {}
#!/usr/bin/env python3
from pytapo import Tapo
import sys
user="*****"
password="*******"
host="192.168.***.**"
def move( X , Y ):
tapo=Tapo(host, user, password)
res ={}
try :
res = tapo.moveMotor( X , Y )
except :
print("Camera en butee (X ou Y)")
res["error_code"] =-1
if(res.get("error_code")==0) :
print( 1 )
else :
print( -1 )
def getAlarmEnabled():
tapo=Tapo(host, user, password)
res=tapo.getAlarm()
print(res["enabled"])
def getMotionDetection():
try:
tapo=Tapo(host,user,password)
res=tapo.getMotionDetection()
except Exception:
print("getMotionDetection KO")
else:
print(1 if res["enabled"] == "on" else 0)
def setMotionDetection(State):
tapo=Tapo(host, user, password)
try :
tapo.setMotionDetection(State)
except Exception :
print("setMotionDetection KO")
def reboot():
tapo=Tapo(host, user, password)
try :
tapo.reboot()
except Exception :
print("reboot KO")
def getBasicInfo():
tapo=Tapo(host, user, password)
print(tapo.getBasicInfo())
def getLED():
tapo=Tapo(host, user, password)
res = tapo.getLED()
print( 1 if res["enabled"] == "on" else 0 )
def setLED(State):
tapo=Tapo(host, user, password)
res ={}
try :
res = tapo.setLEDEnabled(State)
except Exception :
print("setLED KO")
res["error_code"] =-1
if(res.get("error_code")==0) :
print( 1 )
else :
print( -1 )
def getPrivacyMode():
tapo=Tapo(host, user, password)
res = tapo.getPrivacyMode()
print( 1 if res["enabled"] == "on" else 0 )
def setPrivacyMode(mode):
tapo=Tapo(host, user, password)
try :
tapo.setPrivacyMode(mode)
except Exception :
print("setPrivacyMode KO")
def getDayNightMode():
tapo=Tapo(host, user, password)
print(tapo.getDayNightMode())
def setDayNightMode(mode):
tapo=Tapo(host, user, password)
try :
tapo.setDayNightMode(mode)
except Exception :
print("setDayNightMode KO")
def getOsd():
tapo=Tapo(host, user, password)
print(tapo.getOsd())
def getModuleSpec():
tapo=Tapo(host, user, password)
print(tapo.getModuleSpec())
def getFirmwareUpdateStatus():
tapo=Tapo(host, user, password)
res=tapo.getFirmwareUpdateStatus()
print(res)
def isUpdateAvailable():
tapo=Tapo(host, user, password)
res=tapo.isUpdateAvailable()
print(res["result"]["responses"][0]["result"])
def getAllNotificationsEnabled():
tapo=Tapo(host, user, password)
res= tapo.getNotificationsEnabled()
print(res["notification_enabled"])
def getRichNotificationsEnabled():
tapo=Tapo(host, user, password)
res= tapo.getNotificationsEnabled()
print(res["rich_notification_enabled"])
def setAllNotificationsEnabled(State):
tapo=Tapo(host, user, password)
try :
tapo.setNotificationsEnabled(State, None )
except Exception :
print("setAllNotificationsEnabled KO")
def setRichNotificationsEnabled(State):
tapo=Tapo(host, user, password)
try :
tapo.setNotificationsEnabled(None, State )
except Exception :
print("setRichNotificationsEnabled KO")
def getBabyCryDetection():
try:
tapo=Tapo(host,user,password)
res=tapo.getBabyCryDetection()
except Exception:
print("getBabyCryDetection KO")
else:
print(1 if res["enabled"] == "on" else 0)
def setBabyCryDetection(State):
tapo=Tapo(host, user, password)
try :
tapo.setBabyCryDetection(State)
except Exception :
print("setBabyCryDetection KO")
def startFirmwareUpgrade():
tapo=Tapo(host, user, password)
try :
tapo.startFirmwareUpgrade()
except Exception :
print("startFirmwareUpgrade KO")
def getPresets():
tapo=Tapo(host, user, password)
res=str(tapo.getPresets()).replace("{","").replace("}","").replace("'","").replace(",",";").replace(":","|")
print(res)
def savePreset(Name):
tapo=Tapo(host, user, password)
try :
tapo.savePreset(Name)
except Exception :
print("savePreset KO")
def setPreset(IdPreset):
tapo=Tapo(host, user, password)
try :
tapo.setPreset(IdPreset, False) #arbitrairement retry=False mais peut être changé
except Exception :
print("setPreset KO")
# ------- Appels des fonctions
if sys.argv[1] == "move":
move(sys.argv[2] , sys.argv[3] )
elif sys.argv[1] == "reboot":
reboot()
elif sys.argv[1] == "getAlarmEnabled":
getAlarmEnabled()
elif sys.argv[1] == "getMotionDetection":
getMotionDetection()
elif sys.argv[1] == "setMotionDetection":
setMotionDetection( True if sys.argv[2] == "on" else False )
elif sys.argv[1] == "getBasicInfo":
getBasicInfo()
elif sys.argv[1] == "getLED":
getLED()
elif sys.argv[1] == "setLED":
setLED( True if sys.argv[2] == "on" else False )
elif sys.argv[1] == "getPrivacyMode":
getPrivacyMode()
elif sys.argv[1] == "setPrivacyMode":
setPrivacyMode( True if sys.argv[2] == "on" else False )
elif sys.argv[1] == "getDayNightMode":
getDayNightMode()
elif sys.argv[1] == "setDayNightMode":
setDayNightMode(sys.argv[2])
elif sys.argv[1] == "getOsd":
getOsd()
elif sys.argv[1] == "getModuleSpec":
getModuleSpec()
elif sys.argv[1] == "getAllNotificationsEnabled":
getAllNotificationsEnabled()
elif sys.argv[1] == "getRichNotificationsEnabled":
getRichNotificationsEnabled()
elif sys.argv[1] == "setAllNotificationsEnabled":
setAllNotificationsEnabled( True if sys.argv[2] == "on" else False )
elif sys.argv[1] == "setRichNotificationsEnabled":
setRichNotificationsEnabled( True if sys.argv[2] == "on" else False )
elif sys.argv[1] == "getBabyCryDetection":
getBabyCryDetection()
elif sys.argv[1] == "isUpdateAvailable":
isUpdateAvailable()
elif sys.argv[1] == "getFirmwareUpdateStatus":
getFirmwareUpdateStatus()
elif sys.argv[1] == "getPresets":
getPresets()
elif sys.argv[1] == "startFirmwareUpgrade":
startFirmwareUpgrade()
elif sys.argv[1] == "setBabyCryDetection":
setBabyCryDetection( True if sys.argv[2] == "on" else False )
elif sys.argv[1] == "savePreset":
savePreset(sys.argv[2])
elif sys.argv[1] == "setPreset":
setPreset(sys.argv[2])
else:
print("sys.argv[1] inconnu")