IPX800 v5 : récupération des IO par l'API

Bonjour

Je me familiarise avec l’API de l’IPX800 v5. Pour le moment j’en suis à la récupération des IO.

Je comprend que GET /api/core/io me permet de récupérer la liste des IO et je souhaiterais savoir s’il y a la possibilité de filtrer le résultat par type de sortie ou d’entrée. Par exemple les sorties, sorties virtuelles, entrées, etc.

Concernant les IO virtuelles je vois que la réponse contient un propriété « virtual », je peux éventuellement m’en servir pour filtrer la réponse après coup.
Par contre je ne vois rien qui me permette de distinguer une entrée d’un sortie.

Cordialement,

Julien

Bonjour,
Je travaille actuellement sur un utilitaire sous Excel pour la visualisation des ressources et des liens.

Les variables (IO, analog et string) fonctionnent comme suit :

  • Une variable est indépendante (virtuelle) ou liée à une ressource.
  • Elle dispose d’un accès en écriture (Link0) et en lecture (Link1).
  • Si elle est liée à une ressource en écriture (Link0), il s’agit d’une variable de sortie.
  • Si elle est liée à une ressource en lecture (Link1), il s’agit d’une variable d’entrée.
  • Elle peut être raccordée à un lien. Les id des liens sont numérotés à partir de 10485760.

La méthode que j’utilise est la suivante :

Si Link0 > 0 => je teste Link0 AND FFFC00 : Si le résultat est 10485760, il s’agit d’un lien, sinon il s’agit de l’identifiant d’une ressource qui écrit dans la variable, donc la variable est une sortie.
Je fait la même opération sur Link1…
Pour les strings, il n’y a pas de lien, c’est plus simple.

Bonne journée

Pourquoi cette comparaison ? à quoi correspond la valeur FFFC00 ?

A propos des id, est-ce que ceux correspondants aux entrées/sorties physiques sont fixes ? Par exemple, chez moi les sorties ont les id 65536 à 65543. Si ces valeurs sont identiques sur tous les IPX800v5 et si elles le resteront pour les productions futures des IPX800v5, cela me semble suffisant pour filtrer.

Bonjour JuTs,

les Id sont les mêmes sur toutes les machines et ne devraient pas changer, c’est le cœur de la gestion des variables de la V5.

Une remarque : 65536 → 65543 sont les Id des variables de commande des relais.
Les variables des états des relais sont les 8 suivantes.

Bonne journée

1 « J'aime »

Bonjour JuTs,

FFFC00 correspond à la valeur d’un masque exprimé en hexadécimal, appliqué à la valeur de l’identifiant de link0 ou link1.

Explication :

les liens commencent à 10485760 soit A00000 en hexadécimal.
Pour savoir si un identifiant est un lien, on fait une opération ET, bit à bit, avec un masque FFFC00 :

  • soit un identifiant en décimal = 10485850, hexa = A0005A, binaire =1010 0000 0000 0000 0101 1010
    ET
  • Masque en décimal = 16 776 192, hexa =FFFC00, binaire =1111 1111 1111 1100 0000 0000
    Le résultat est = 10485760, hexa=A00000 , binaire = 1010 0000 0000 0000 0000 0000

Donc l’identifiant correspond à un lien.

Pour les variables IO [IPX], pour simplifier, il est possible d’utiliser les _id suivants :

_id name
65536 [IPX]Relay cmd 1
65537 [IPX]Relay cmd 2
65538 [IPX]Relay cmd 3
65539 [IPX]Relay cmd 4
65540 [IPX]Relay cmd 5
65541 [IPX]Relay cmd 6
65542 [IPX]Relay cmd 7
65543 [IPX]Relay cmd 8
65544 [IPX]Relay state 1
65545 [IPX]Relay state 2
65546 [IPX]Relay state 3
65547 [IPX]Relay state 4
65548 [IPX]Relay state 5
65549 [IPX]Relay state 6
65550 [IPX]Relay state 7
65551 [IPX]Relay state 8
65552 [IPX]Digital input 1
65553 [IPX]Digital input 2
65554 [IPX]Digital input 3
65555 [IPX]Digital input 4
65556 [IPX]Digital input 5
65557 [IPX]Digital input 6
65558 [IPX]Digital input 7
65559 [IPX]Digital input 8
65560 [IPX] Opto 1
65561 [IPX] Opto2
65562 [IPX] Opto 3
65563 [IPX] Opto 4
65564 [IPX]Open coll. state 1
65565 [IPX]Open coll. state 2
65566 [IPX]Open coll. state 3
65567 [IPX]Open coll. state 4
65568 [IPX]Open coll. 1
65569 [IPX]Open coll. 2
65570 [IPX]Open coll. 3
65571 [IPX]Open coll. 4
65572 [IPX]Reboot
65573 [IPX]Sel BP

Au delà, les identifiants dépendent de la configuration personnelle de l’IPX800

Bonne journée.

2 « J'aime »

Merci pour l’explication.

Il me reste un cas pour lequel je recherche une solution. J’essaie de trouver un moyen de récupérer les sorties qui ont une temporisation. Je vois que le link1 du start d’un TEMPO correspond au link0 de l’Output du TEMPO et que le link1 de ce dernier correspond au link0 du relais. Mais je ne suis pas sûr qu’il y ait un moyen de connaitre le type d’objet contrôlant un relai. Ni de connaître le type d’un IO tout court d’ailleurs.

Bonjour,

Comme je l’ai déjà indiqué, les variables peuvent être indépendantes (virtuelle) ou liées à une ressource (objet, interface, extension…). Elle peut également être reliée à des liens.

Les identifiant des liens sont dans la plage A00000. Visuellement, cela correspond à un identifiant du type 10485xxx. Par le calcul, il suffit de diviser la valeur de l’identifiant par 65535 et de vérifier si la valeur entière du résultat est égale à 160. Cette opération peut être réalisée par un décalage de 16 bits à droite de l’identifiant ou par l’utilisation de l’opérateur "\" (en fonction de l’outil que vous utilisez).

Si l’identifiant de Link0 ou sur Link1 est un lien :
-Toutes les variables ayant le même lien sur Link0 ou sur Link1 sont liées.

Si l’identifiant de Link0 ou sur Link1 n’est pas un lien :
-il s’agit de l’identfiant de la ressource, le « ressourceId »
-toutes les variables ayant le même RessourceId sur Link0 ou sur Link1 appartiennent à la même ressource.

il s’agit de la resssourceId de la Tempo

il s’agit de la référence du lien (en réalité du connecteur). En faisant l’opération Link/-10485760, on doit retrouver la référence du connecteur utilisé.
Le link1 de l’IO doit donner le ressourceId du relais.

Le mapping des types de ressources n’est malheureusement pas publié par GCE Je ne sais pas si c’est possible de l’obtenir.

Pour info, voici une partie du mapping que j’ai reconstitué, sans garantie …

image

Bonne journée

1 « J'aime »

J’imagine que par « ressourceId » vous parlez de la propriété _id retourné dans les réponses de l’API ? Dans mon cas cela ne correspond pas. Ou alors je me suis peut-être mal exprimé.

Voici un exemple concret de ce que j’obtiens avec un appel à /api/core/io (j’ai extrait les éléments qui m’intéressent) :

Elément correspondant à une commande relai que je sais contrôlée par un Tempo
{
« _id »: 65538,
« name »: « [IPX]Relay cmd 3 »,
« link0 »: 10485764,
« link1 »: 12648450,
« virtual »: false,
« on »: false
}

au moyen de la valeur link0 10485764 je tombe sur l’output de mon tempo

{
« _id »: 65588,
« name »: « [TEMPO N°1]Output »,
« link0 »: 13697024,
« link1 »: 10485764,
« virtual »: false,
« on »: false
}

dont le link0 me permet de trouver le start du tempo

{
« _id »: 65583,
« name »: « [TEMPO N°1]Start »,
« link0 »: 0,
« link1 »: 13697024,
« virtual »: false,
« on »: false
}

Le tempo lui-même à quant à lui l’id 1310720 . Trouvé au moyen de la requête /api/object/timer dont la réponse contient

{
« _id »: 1310720,
« name »: « TEMPO N°1 »,
« errorStatus »: « 0x0000 »,
« func »: « tempo »,
« bSecond »: true,
« bOnOff »: false,
« bSingle »: false,
« ioStart »: « off »,
« ioEnable »: « on »,
« anaCounter1 »: 0,
« anaTime1 »: 5,
« ioOut »: « off »
}

Par contre je n’ai pas trouvé comment mettre en relation cet objet avec les IO identifiés plus haut. Je note que le « name » du start et de l’output ont toujours la même structure et contiennent le nom de l’objet entre . Je pourrais m’en servir pour vérifier si un objet de type « func »: « tempo » correspond. Il y éventuellement le cas, certes un peu tordu, où plusieurs tempo auraient le même nom qui pourraient poser problème. Même si je ne vois pas l’intérêt d’en avoir deux avec le même nom, c’est techniquement possible.

Bonjour JuTs,

J’ai pas mal galéré sur ces fameux « ressourceId »
Pour clarifier mon propos, je nomme :

  • ressourceId l’identifiant d’une ressource telle que delay, tempo, ioRelays, ana_IPX_Input, long click,counter, comparator…
  • groupId l’identifiant d’une instance remontée par l’API telle que ipx, timer, switches, modbus, planning, counter, comparator…

Comme vous, j’ai constaté que, parfois, le ressourceId indiqué dans la variable, ne correspondait pas au groupId. C’est le cas des groupes ipx, timer, switch, modbus, MQTT…

Le groupe timer contient 5 sous-groupes indiqué par le paramètre « func » correspondant aux ressources delay, tempo, chrono, pulse et blinker.

Pour faire le lien entre le ressourceId et le groupId, j’opère de la façon suivante :
(exemple pour le groupe timers)

  • consultation des identifiants du groupe en activant l’option « filter_id » :
    URL: http://192.168…/api/object/timer?ApiKey=my_api_key&option=filter_id
    image
    nous obtenons les identifiants des variables liées à la ressource

  • consultation d’une des variable de la ressource (iostart_id = 65588 par exemple).
    image
    link0 = 10485779 \65536 =160 il s’agit d’un connecteur (lien)
    link1 = 13697025 : c’est le ressourceId de la tempo

  • on en déduit que la tempo anti-rebond… à un groupId= 1310721 et un ressourceId = 13697025

Concernant le groupe ipx, c’est semblable. Ici pas de paramètres func, mais tous les énumérés […] disposent d’un ressourceId différent ainsi que la variable reboot. Les autres appartiennent à la ressource IPX.
Pour information, voici le mapping des adresses que j’ai reconstitué :

Edit le 26/01/2022 pour correction et ajout d’info

3 « J'aime »

Bonjour @Michel94 ,
Super taf :nerd_face: les trous dans les valeurs doivent correspondre à des fonctionnalités à venir ! :wink: @GCE ce serait bien de donner un max d’infos possible pour les bidouilleurs en herbe ! :+1: :grin:

Aaaahhhhh… filter_id, voici donc l’élément qu’il me manquait :slight_smile:
Merci, maintenant j’ai tout ce qu’il me faut. En tout cas pour les cas que j’ai prévu jusqu’à maintenant.

Julien

Bonjour

Je progresse, j’ai pratiquement terminé le développement des cas que je souhaitais gérer. Il me reste un cas à vérifier. En ce qui concerne le analog input, est-ce que les valeurs sont fixe comme pour les autres IO physique ? Valeurs 262144 à 262147 chez moi.

Cordialement,

Julien

Bonsoir JuTs,

oui

Bonne soirée

1 « J'aime »