Récupérer l'état "sortie interdite"?

Bonjour à tous,
J’ai récemment fait l’acquisition de la chatière connectée Sure Petcare (la petite, dual scan). J’ai naturellement connecté la chatière et son hub à l’excellent plugin sure-petcare (de @vedrine il me semble).

J’ai une question sur le plugin : je n’ai pas réussi à trouver l’information qui permet de savoir si un animal est autorisé ou pas à sortir. Cela correspond à cet écran sur l’app officielle :

On a bien les commandes associées dispo dans le plugin (appelées « Autoriser animal » et « Interdire Animal »), mais pas l’info retour. J’ai loupé quelque chose ?

Dans le cas où cet info ne serait pas dispo dans le plugin, une évolution est-possible pour l’y intégrer ?

Merci d’avance pour vos réponses :slight_smile:

Le problème c’est que je ne suis pas arrivé à trouver comment implémenter cette commande info.
Pour les commandes autoriser et interdire animal ce sont des commandes action de la chatière de type liste (select) et on choisit l’animal à autoriser ou interdire.
Mais pour la commande info j’ai deux paramètres la chatière et l’animal un des deux sera pris en compte suivant que je décide que c’est une commande info de la chatière ou de l’animal mais pour le second ?? Avec le choix plutôt réduit dans Jeedom pour les types de commandes info je ne vois pas comment faire. Une solution serait de retourner une chaîne avec la liste des animaux autorisés si c’est une commande chatière ou la liste des chatières autorisés dans le cas d’une commande animal mais je ne sais pas si ce serait très exploitable.

Merci pour ta réponse.
Est-ce qu’il y a une doc de l’API surepetcare ? Que je puisse voir les méthodes qu’ils proposent pour récupérer cette info ? Et t’aider le cas échéant

Sure Petcare n’a a ma connaissance pas d’API officielle, tout le travail a été fait par des passionnés en particulier en interceptant le trafic entre l’appli smartphone et leur serveur.
Je me suis aussi inspiré de codes trouvés sur Github pour écrire le plugin.
Regarde le code tu auras une idée des appels :

Pour récupérer les autorisations d’une chatière il faut appeler l’url https://app.api.surehub.io/api/device/numerodechatière/tag mais pour cela il faut connaître le numéro de la chatière tu peux l’avoir en mettant les logs du plugin en debug et en regardant les logs.
Mais il y a bien sûr un mécanisme de protection, regarde le code on récupère un jeton (token) à l’aide du nom d’utilisateur et du mot de passe et ensuite on passe ce token dans tous les appels.
Je tiens à souligner que pour moi le problème n’est pas de récupérer des autorisations, je sais faire, le problème c’est de savoir comment la mettre en forme comme une commande info.
Si çà te semble bien d’avoir une commande info de la chatière (ou du distributeur de nourriture) qui retourne une chaine de caractère avec tous les noms des animaux autorisés séparés par exemple par des virgules, pas de problème je peux le faire très rapidement.
A signaler : cela rajoutera une requête par chatière ou distributeur dans le cron et toutes les commandes action donc cela ralentira le temps de réponse des commandes pour tout le monde je ne sais pas si le jeu en vaut la chandelle.

Bon j’ai regardé le code de plus près.
Si j’ai bien compris, une requête « /device?with[]=tags » renvoi un json de la forme :

{
    "data": [
        {
            "id": xxx,
            ...
            "tags": [
                {
                    "id": xxx,
                    "index": 0,
                    "profile": 3,
                    "version": "Nw==",
                    "created_at": "2023-09-05T17:04:38+00:00",
                    "updated_at": "2023-09-07T20:59:34+00:00"
                },
                {
                    "id": yyy,
                    "index": 1,
                    "profile": 2,
                    "version": "MA==",
                    "created_at": "2023-09-05T17:14:43+00:00",
                    "updated_at": "2023-09-05T17:14:43+00:00"
                }
            ]
        }
    ]
}

Ce qui nous intéresse c’est de récupérer la liste des « tags » pour lequel la propriété « profile » vaut 3 (qui correspond à un état « interdit de sortir »).

Ce bout de code permet de créer un tableau avec la liste id d’animaux avec un « profile=3 » :

// Analyser la réponse JSON de la requête /device?with[]=tags
$data = json_decode($jsonResponse, true);

// Créer un tableau pour stocker les IDs où "profile" est égal à 3
$tagIdsWithProfile3 = [];

// Parcourir les données pour extraire les IDs appropriés
foreach ($data['data'] as $item) {
    foreach ($item['tags'] as $tag) {
        if ($tag['profile'] === 3) {
            $tagIdsWithProfile3[] = $tag['id'];
        }
    }
}

Dans le cron() 1min, on rajoute une propriété « unauthorized » au json des pets, en vérifiant si leur tag appartient à ce tableau. Cette nouvelle propriété sera alors directement utilisable par le front dans une commande info.

Voici une ébauche que je viens de faire en 5min (pas testé, rien du tout, c’est juste pour montrer mon idée) : WIP : added 'unauthorized' property on pet object by Dreaky255 · Pull Request #1 · Dreaky255/jeedom-surepetcare · GitHub

PS : Dans le commit, j’ai inversé les appels à « /device » et « /pets » car j’ai d’abord besoin d’avoir les infos devices avant celles des pets. Le « compare » du commit est pas très lisible du coup.

Qu’en penses-tu ?

Oui c’est çà une valeur du profile égale à 3 signifie interdit de sortir et une valeur égale à 2 signifie autorisé à sortir. Sur les forums certains disent avoir observé d’autres valeurs du profile mais on n’a pas pu déterminer ce qu’elles signifiaient et comme Sure Petcare ne veut pas aider on n’en sais pas plus.
Le problème c’est que moi (mais aussi d’autres utilisateurs du plugin) on a plusieurs chatières : chez moi une donne accès à la terrasse et l’autre à la chaterie et les autorisations ne sont pas les mêmes (tous les chats ont accès à la chaterie seul le chien ne peut pas entrer) donc je ne peux pas intégrer ton code tel quel il n’est pas assez général.
Je tiens à ce que le plugin reste utilisable par tout le monde quel que soit les équipements et les animaux (par exemple il y a au moins un utilisateur qui n’a pas de chatière, mais uniquement des distributeurs de nourriture et de boisson et j’ai dû modifier mon code pour que çà ne bugue pas dans son cas je n’y avais pas pensé).
Une solution serait que la liste des animaux interdits soit une commande de chaque chatière mais je ne sais pas si çà conviendrait à ton usage ?
Remarque: çà n’a pas grand chose à voir mais dans mon cas je ne peux pas me servir de l’information « à l’extérieur » car cela signifie « sur la terrasse ou dans la chaterie » ce qui n’est pas du tout la même chose. je suis obligé de regarder par quelle chatière il est « sorti »
Mais l’idée de se servir du"&with[]=tags" plutôt que du « /tag » est très bonne çà évite de rajouter une requête donc çà ne ralentit pas le plugin (tu as dû observer que le temps de réponse de leur serveur peut être très long …)

Hello,

j’utilise aussi ce plugin, je regarderai quand j’aurai fini mes todos de mon coté pour mes autres plugins :slight_smile:

Hello @shun84 super si tu as des suggestions n’hésite pas, çà fait un moment que ce plugin n’a pas évolué car il satisfait mes besoins mais je serai enchanté de l’améliorer.

Le problème c’est que moi (mais aussi d’autres utilisateurs du plugin) on a plusieurs chatières : chez moi une donne accès à la terrasse et l’autre à la chaterie et les autorisations ne sont pas les mêmes (tous les chats ont accès à la chaterie seul le chien ne peut pas entrer) donc je ne peux pas intégrer ton code tel quel il n’est pas assez général.

Effectivement, cela n’est du coup pas aussi simple.
Est-ce qu’on ne pourrait pas, dans la même philo que mon idée, rajouter une propriété « unauthorized » à chaque pet, mais de type « tableau », qui contiendrait tous les devices sur lesquels le pet est interdit ? On serait alors capable de lister dans l’objet « pet », les chatières sur lesquelles l’animal ne peut pas passer. Ensuite, libre à l’utilisateur de gérer cette commande info comme bon lui semble.
Du coup dans mon code que j’ai donné, à la place de ça :

$item['unauthorized'] = in_array($item['tag']['id'], $tagIdsWithProfile3);

il faudrait faire un truc comme ça :

$item['unauthorized'] = $tagIdsWithProfile3;

Dans ce cas, au lieu de stocker un boolean dans la propriété « unauthorized », on stock directement le tableau entier de tags de device pour lequel le pet est interdit.
Et du coup on peut jouer avec cette commande info dans l’objet animal sur jeedom, au lieu de l’objet chatière. Et accessoirement, si ce profile=3 est aussi valable pour les « bols connectés », on aurait aussi l’information « ce pet ne peut pas manger dans ce bol ».

Une solution serait que la liste des animaux interdits soit une commande de chaque chatière mais je ne sais pas si çà conviendrait à ton usage ?

En l’état moi ça m’irait, je pourrai jouer avec des scripts pour extraire la donnée dans un virtuel, mais c’est pas forcément très user-friendly pour l’utilisateur « novice ».

Je pense que dans tous les cas, y’a moyen de trouver un compromis qui aille pour tout le monde, sans devoir refondre tout le plugin :wink:

Pourtant si tu regardes la copie d’écran que tu as mis dans ton premier message, c’est bien la logique qu’a prise Sure Petcare : c’est un écran relatif à la chatière pas à l’animal :smiley:

Ceci dit les deux solutions sont tout à fait codables, on peut même faire les deux :smiley:: avec le bémol que compte tenu des limitations des commandes infos de Jeedom ce sera une liste de chatières (ou d’animaux) car il faudra bien faire un implode du tableau pour le mettre dans la commande info ou alors le mettre sous la forme d’un json.

J’ai poussé sur Github une version modifiée qui rajoute une commande info string « Animaux interdits de sortir » pour la petite chatière (la grande n’a pas ces possibilités). Elle retourne une liste des noms des animaux séparés par des ;
Pour le moment je n’ai pas fait la commande info des animaux donnant une liste des chatières où ils sont interdits. Je n’ai pas non plus complété la documentation et le changelog.

1 « J'aime »

Hello,
J’ai testé ta nouvelle version, tout fonctionne chez moi, j’ai un petit virtuel qui me remonte l’info dans ma brique , tout nickel !

Merci beaucoup pour ton travail !

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.